gpt4 book ai didi

java - 刷新 token 授予类型提供另一个刷新 token ?

转载 作者:行者123 更新时间:2023-11-30 02:19:18 26 4
gpt4 key购买 nike

在开发 Spring Rest API 时,我注意到一些我不太理解的事情。我正在使用 refresh_token 授予类型。当我访问 /myapi/oauth/token?grant_type=refresh_token 时它工作正常,但我很困惑为什么它会返回一个 Shiny 的新刷新 token 以及一个新的访问 token 。

这会不会导致刷新 token 的过期时间变得毫无用处?如果他们可以使用一个刷新 token 来获取另一个刷新 token ,那么他们不是就拥有无限的刷新 token 吗?

编辑:OAuth 配置的相关部分

@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);
}

}

最佳答案

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

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

但是,对于 JWT token ,有一个开放的 bug因此,该标志值似乎被忽略,并且每次在 JwtAccessTokenConverter#enhance() 方法中都会生成一个新的刷新 token 。

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

关于java - 刷新 token 授予类型提供另一个刷新 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47318215/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com