Spring OAuth2刷新令牌保留旧的访问令牌

时间:2019-08-06 08:52:02

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

我创建了身份验证服务器,并且工作正常,问题是当我想刷新访问令牌时,旧的访问令牌留在数据库中,并且在日志中,找不到令牌的访问令牌 < / p>

步骤如下: 我用POST /oauth/tokengrand_type=refresh_token调用refresh_token=ACTUAL_TOKEN,作为响应,我得到了新的刷新令牌而不是旧的刷新令牌,并且新的访问令牌引用了不存在的刷新令牌。 因此,如果我尝试使用新的刷新令牌再次调用刷新,则会收到错误消息,该令牌无效,但使用旧的令牌我获得新的访问令牌,但旧令牌仍在数据库中

我仍然无权嵌入图像,因此这是登录后和第一次刷新后的数据库状态链接。

After login DB status After first refresh

配置是这样的,因此它应该使用旧的刷新令牌:

@Bean
public DefaultTokenServices tokenServices(final TokenStore tokenStore,
                                              final ClientDetailsService clientDetailsService) {
        DefaultTokenServices tokenServices = new DefaultTokenServices();
        tokenServices.setSupportRefreshToken(true);
        tokenServices.setTokenStore(tokenStore);
        tokenServices.setClientDetailsService(clientDetailsService);
        tokenServices.setAuthenticationManager(this.authenticationManager);
        return tokenServices;
    }

并且看起来org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter#enhance语句中if中的refresh_token已更改,因为之前如果是正确的刷新令牌

DefaultOAuth2RefreshToken token = new DefaultOAuth2RefreshToken(  
      encode(encodedRefreshToken, authentication));  
if (refreshToken instanceof ExpiringOAuth2RefreshToken) {  
   Date expiration = ((ExpiringOAuth2RefreshToken) refreshToken).getExpiration();  
  encodedRefreshToken.setExpiration(expiration);  
  token = new DefaultExpiringOAuth2RefreshToken(encode(encodedRefreshToken, authentication), expiration);  
}  
result.setRefreshToken(token);

最后,我有完整的旧access_tokens数据库。

0 个答案:

没有答案