Java Spring Resource Server似乎在响应时检查JWT令牌

时间:2018-03-27 14:33:27

标签: java spring spring-boot spring-security jwt

我有一个@EnableResourceServer,用于检查请求的JWT。 这个JWT有一个30秒的TTL,它被我的REST API接受。 但有时这个过程需要超过30秒才能发送响应。

即使我的应用程序返回200响应代码,Spring也会将其替换为401,这意味着我的JWT已过期。

我认为这是一种不良行为,JWT不应该在回复时进行检查。 有人遇到同样的问题并知道如何避免它吗?

我使用Spring boot 1.5.10.RELEASE,spring-security-oauth2 2.2.1.RELEASE,spring-security-jwt 1.0.9.RELEASE。

我的课程:

@EnableResourceServer
@Configuration
@Profile("security")
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
    @Override
    public void configure(HttpSecurity http) throws Exception {
    http.requestMatchers().and().authorizeRequests().antMatchers("/pay/**").authenticated();
    }
}

我正在使用该属性:

   security.oauth2.resource.jwt.key-uri=

这里有一个证明呼叫的日志是两次:

2018-03-27T15:07:48.801-04:00 [APP/PROC/WEB/0] [OUT] 2018-03-27 19:07:48.800 DEBUG [accueil-transfert,c0baad95368697cd,c0baad95368697cd,true] 15 --- [io-8080-exec-10] p.a.OAuth2AuthenticationProcessingFilter : Authentication success: org.springframework.security.oauth2.provider.OAuth2Authentication@822a1a7a: Principal: null; Credentials: [PROTECTED]; Authenticated: true; Details: remoteAddress=xxx.xxx.xxx.xxx, tokenType=BearertokenValue=<TOKEN>; Not granted any authorities

...

2018-03-27T15:08:39.130-04:00 [APP/PROC/WEB/0] [OUT] 2018-03-27 19:08:39.129 DEBUG [accueil-transfert,c0baad95368697cd,c0baad95368697cd,true] 15 --- [nio-8080-exec-1] p.a.OAuth2AuthenticationProcessingFilter : Authentication request failed: error="invalid_token", error_description="Access token expired: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiAiUElTR...

请求存储在我的RestController中的completableFuture中:

    @PostMapping("/myUrl")
    public CompletableFuture<ResponseEntity<CorpsReponseDto>> effectue(@RequestHeader HttpHeaders enteteRequete,
            @Valid @RequestBody CorpsRequeteDto corpsRequete, BindingResult bindingResult) {

        CompletableFuture<ResponseEntity<CorpsReponseDto>> future = new CompletableFuture<>();
        ...
        return future;
}

在@Service类中完成:

future.complete(new ResponseEntity<>(reponseDto, httpStatus));

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:0)

我理解你清楚地问到这个过程需要超过30年,但是 JWT令牌存储的好处是当RestAPI消耗调用资源端点时,资源服务器无需检查授权服务器,因为资源可以使用公钥自行修改。

通过@EnableResourceServer和application.properties中为security.oauth2.resource.jwt.key-uri提供的自动配置。

答案 1 :(得分:0)

原因是,对于REQUEST类型(用于HTTP请求接收)调用'filterChain'一次,对于Async类型调用一次'filterChain'(在响应过程中用于CompletableFuture)。

要设置一个属性以避免异步链:

security.filter-dispatcher-types=REQUEST, ERROR

(见https://github.com/spring-projects/spring-security-oauth/issues/736