首页 > 解决方案 > Spring OAuth2 刷新令牌留下旧的访问令牌

问题描述

我创建了身份验证服务器,它运行良好,问题是当我想刷新访问令牌时,旧的访问令牌留在数据库中,并且在日志中有 Failed to find access token for token

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

我仍然没有嵌入图像的权利,所以这里是登录后和第一次刷新后数据库状态的链接。

登录后 DB状态 第一次刷新后

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

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

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

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 数据库。

标签: javaspring-bootspring-security-oauth2

解决方案


推荐阅读