在开发我的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)
答案 0 :(得分:2)
根据OAuth2 spec(点H),可以在刷新访问令牌时选择性地返回新的刷新令牌,因此行为符合规范。
Spring Boot提供reuseRefreshToken
标志来控制此行为。默认情况下设置为true,这意味着刷新令牌应该重用,并且当您请求新的访问令牌时,不会生成新的刷新令牌。
但是,在JWT令牌的情况下,有一个开放的bug,由于这个原因,标志值似乎被忽略,并且每次在JwtAccessTokenConverter#enhance()
方法中都会生成一个新的刷新令牌。
附注:可以在reuseRefreshToken
的实例上设置AuthorizationServerConfigurerAdapter
标志,或者通过公开类型为DefaultTokenServices
的bean并在其中设置标志。