簡體   English   中英

Spring Boot:當令牌也來自調用另一個 api 時,rest api 中請求標頭中的令牌身份驗證(承載)

[英]Spring Boot : Token authentication(bearer) in request headers in rest api when token also comes from calling another api

在我的 Spring Boot 應用程序中,我有一個調度程序,它調用一個 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. 這是正確的方法
  2. 如果未指定,Spring 默認范圍始終為單例
  3. 使用攔截器是可以的,但是如果你想調用一個沒有令牌的 API 呢?

使用兩個單獨的方法使用單獨的類發送帶令牌和不帶令牌的請求的最佳方法

@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);

}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM