我有一个@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));
非常感谢你的帮助。
答案 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)