Spring Boot: аутентификация токена (однонаправленный) в заголовках запросов в API остальных, когда токен также происходит от вызова другого API - PullRequest
0 голосов
/ 18 сентября 2018

В моем весеннем загрузочном приложении у меня есть планировщик, который вызывает API для генерации токена, срок действия которого истекает через 15 минут.Время работы планировщика также 15 мин.пожалуйста, найдите ниже образец:

    public class TokenGeneration {
    private static String token = null;

    @Scheduled(15 minutes)
    public String fetchToken() {
        // api call which return token
        HttpEntity<model> response = restTemplate.exchange(uri, POST, entity, model.class);
        token = response.getBody().getAccessToken();
    }
 }

Я сохранил значение токена в статической переменной от нестатического метода, чтобы я мог использовать эту переменную токена везде, где я хочу использовать значение токена.это правильный подход?если нет, то, пожалуйста, дайте мне знать, как мне этого добиться.

Нужно ли создавать синглтон класса TokenGeneration, чтобы только один экземпляр этого класса создавался через приложение?

Также я хочу создатьперехватчик или фильтр, в котором я могу установить заголовки авторизации и значение токена, чтобы каждый запрос автоматически заполнял заголовок авторизации, я не хочу устанавливать заголовок авторизации в каждом запросе так:

HttpHeaders headers = new HttpHeaders();
    headers.set(CpsConstant.AUTHORIZATION, CpsConstant.BEARER + token);

Итак, япопытался использовать этот пользовательский перехватчик:

 public class RestTemplateInterceptor implements ClientHttpRequestInterceptor{

@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {

     String token = TokenGeneration.token;
     request.getHeaders().add("Authorization", "Bearer " + token);    
     return execution.execute(request, body);
}

добавит этот перехватчик в restTemplate в файле конфигурации.

Таков ли это правильный подход как для генерации токенов, так и для установки заголовков для каждого запроса или любогоулучшения должны быть сделаны в этом подходе?Я думаю о вызове метода генерации токена в перехватчике в случае токена, как ноль, как:

if(token == null){
//call token generation fetchToken method 
}

1 Ответ

0 голосов
/ 19 сентября 2018
  1. Это правильный подход
  2. Область Spring по умолчанию всегда одноэлементная, если не указано
  3. Можно использовать перехватчик, но что делать, если вы хотите вызывать API безtoken?

Лучший способ использовать два отдельных метода для отправки запроса с токеном и без токена с использованием отдельного класса

@Component
public class RestClient {

@Autowired
RestTemplate restTemplate;

public HttpHeaders getRequestHeaderBearer() {

HttpHeaders headers = new HttpHeaders();

headers.setContentType(MediaType.APPLICATION_JSON);
headers.add(HeaderParameters.AUTHORIZATION, HeaderParameters.BEARER + 
TokenGeneration.token);

return headers;

}

public HttpHeaders getRequestHeader() {

HttpHeaders headers = new HttpHeaders();

headers.setContentType(MediaType.APPLICATION_JSON);

return headers;

}

public <T> ResponseEntity<T> restExchangeBearer(String url, HttpMethod httpMethod,
    Class<T> classObj) {

return restTemplate.exchange(url, httpMethod,
    new HttpEntity<>("parameters", this.getRequestHeaderBearer()), classObj);

}

public <T> ResponseEntity<T> restExchange(String url, HttpMethod httpMethod,
    Class<T> classObj) {

return restTemplate.exchange(url, httpMethod,
    new HttpEntity<>("parameters", this.getRequestHeader()), classObj);

}
}
...