java - Spring 启动: Token authentication(bearer) in request headers in rest api when token also comes from calling another api

标签 java rest spring-boot spring-security authorization

在我的 Spring Boot 应用程序中,我有一个调度程序,它调用 API 来生成 token ,该 token 将在 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();
    }
 }

我通过非静态方法将 token 值存储在静态变量中,以便我可以在任何想要使用 token 值的地方使用此 token 变量。这是正确的方法吗?如果没有,请告诉我如何实现这一目标。

我是否需要将 TokenGeneration 类设置为单例,以便通过应用程序仅创建该类的一个实例?

此外,我想创建一个拦截器或过滤器,在其中可以设置授权 header 和 token 值,以便每个请求都会自动填充授权 header ,我不想在每个请求中设置授权 header ,如下所示:

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中添加此拦截器。

那么这种方法对于 token 生成以及为每个请求设置 header 都是正确的吗?或者这种方法需要进行任何改进吗? 我考虑在 token 为 null 的情况下调用拦截器中的 token 生成方法,例如:

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

最佳答案

  1. 这是正确的做法
  2. 如果未指定,Spring 默认作用域始终为单例
  3. 使用拦截器是可以的,但是如果想调用没有token的API怎么办?

使用两个单独的方法使用单独的类发送带 token 和不带 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);

}
}

关于java - Spring 启动: Token authentication(bearer) in request headers in rest api when token also comes from calling another api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52393514/

相关文章:

java - 使用 Spring Boot 每 10 分钟将数据流式传输到 SQL 数据库

java - 启动 HTTP 服务器时未找到 Jersey ResourceConfig

c++ - 如何在 Ubuntu Linux 上将 C++ REST SDK 编译成静态库?

spring - 考虑在您的配置中定义一个名为 'entityManagerFactory' 的 bean

java - 如何为 Spring Data JPA 查询设置默认架构名称?

java - 无法使用log4j2配置spring cloud

java - 在 Java 中正确解析 BitTorrent UDP 通告响应

java.lang.VerifyError : (class: org/apache/jasper/compiler/JspUtil, 方法:<clinit> 签名:()V) 函数参数不兼容

java - Hibernate OneToMany 列表中的重复结果

java - Google Cloud Platform - 云函数 API - 401 未经授权