java - Spring OAuth2 刷新令牌留下旧的访问令牌
问题描述
我创建了身份验证服务器,它运行良好,问题是当我想刷新访问令牌时,旧的访问令牌留在数据库中,并且在日志中有 Failed to find access token for token
步骤如下:我调用and作为响应POST /oauth/token
,我得到了新的刷新令牌而不是旧的,并且新的访问令牌引用了不存在的刷新令牌。因此,如果我尝试使用新的刷新令牌再次调用刷新,我会收到错误,即令牌无效但使用旧令牌我得到新的访问令牌,但旧令牌仍在数据库中grand_type=refresh_token
refresh_token=ACTUAL_TOKEN
我仍然没有嵌入图像的权利,所以这里是登录后和第一次刷新后数据库状态的链接。
配置是这样的,所以它应该使用旧的刷新令牌:
@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 数据库。
解决方案
推荐阅读
- istio - 将bookinfo部署到另一个命名空间,访问入口网关返回404。如何为非默认命名空间配置虚拟服务?
- python - Django 表单未在模板中上传
- powershell-4.0 - 一行中的多个命令 - Powershell、Escape"
- drupal-7 - Drupal 7.“用户警告:文件系统中缺少以下模块:常见。”
- elasticsearch - 完成建议的标记字符串
- c - 如何在C中通过引用传递结构?
- python - sklearn 的 TimeSeriesSplit 仅支持单步预测范围是否有原因?
- c - 如何对套接字值执行单元测试?
- dart - Flutter android 等效于 scaleX 和 scaleY 属性
- amp-html - AMP - 直接访问 json 数据