refresh_token grant类型提供另一个刷新令牌?

时间:2017-11-15 22:13:21

标签: java spring-security-oauth2

在开发我的Spring Rest API时,我注意到了一些我不太了解的东西。我使用/myapi/oauth/token?grant_type=refresh_token授权类型。当我访问@Configuration @EnableAuthorizationServer public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { @Autowired private AuthenticationManager authenticationManager; @Autowired private UserDetailsService userDetailsService; @Bean public JwtAccessTokenConverter accessTokenConverter() { JwtAccessTokenConverter accessTokenConverter = new JwtAccessTokenConverter(); accessTokenConverter.setSigningKey("abcd1234"); return accessTokenConverter; } @Bean public TokenStore tokenStore() { return new JwtTokenStore(accessTokenConverter()); } @Bean @Primary public DefaultTokenServices tokenServices() { DefaultTokenServices defaultTokenServices = new DefaultTokenServices(); defaultTokenServices.setTokenStore(tokenStore()); defaultTokenServices.setSupportRefreshToken(true); return defaultTokenServices; } @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { clients.inMemory() .withClient("myclient") .secret("mysecret") .authorizedGrantTypes("password", "refresh_token") .scopes("read") .autoApprove("read") .accessTokenValiditySeconds(300) .refreshTokenValiditySeconds(12000); } @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain(); tokenEnhancerChain.setTokenEnhancers(Arrays.accessTokenConverter())); endpoints .tokenStore(tokenStore()) .tokenEnhancer(tokenEnhancerChain) .authenticationManager(authenticationManager) .userDetailsService(userDetailsService); } } 时,它工作正常,但我很困惑为什么它返回一个闪亮的新刷新令牌以及一个新的访问令牌。

这不会使刷新令牌的到期时间变得无用吗?如果他们可以使用刷新令牌来获取另一个刷新令牌,他们是否会拥有无限制的刷新令牌?

编辑:OAuth配置的相关部分

grid <- expand.grid(x, x)
grid$strength <- grid$Var1 - grid$Var2
mat <- matrix(grid$strength, nrow=5, ncol=5, byrow=TRUE)

1 个答案:

答案 0 :(得分:2)

根据OAuth2 spec(点H),可以在刷新访问令牌时选择性地返回新的刷新令牌,因此行为符合规范。

Spring Boot提供reuseRefreshToken标志来控制此行为。默认情况下设置为true,这意味着刷新令牌应该重用,并且当您请求新的访问令牌时,会生成新的刷新令牌。

但是,在JWT令牌的情况下,有一个开放的bug,由于这个原因,标志值似乎被忽略,并且每次在JwtAccessTokenConverter#enhance()方法中都会生成一个新的刷新令牌。

附注:可以在reuseRefreshToken的实例上设置AuthorizationServerConfigurerAdapter标志,或者通过公开类型为DefaultTokenServices的bean并在其中设置标志。