Spring OAuth2每个令牌的访问令牌过期时间更新



我有一个授权服务器和多个OAuth2资源服务器。所有这些都是使用Spring Security OAuth2实现的。我还有使用授权代码流生成令牌的前端客户端。

我的情况是,如果刷新令牌有效期为2小时,访问令牌有效期为1小时。首先获取令牌没有问题(两个令牌都是新的)。1小时后,访问令牌过期。现在假设应用程序使用现有的刷新令牌重试一个新的访问令牌仅在另一个30分钟(1.5小时过去了),并生成一个新的访问令牌,有效期为1小时,比刷新令牌多30分钟。在前端,我将令牌存储在cookie中,刷新令牌在30分钟后被删除。当我尝试使用验证码流再次获取令牌时,spring oauth2服务器返回相同过期的刷新令牌和活动访问令牌。我的应用程序进入一个混乱的状态,无论用户是否被授权,因为它只有访问令牌,即使经过几次重试。

是否有可能生成访问令牌与到期时间总是小于或等于刷新令牌?

你应该得到一个新的access_tokenrefresh_token当你尝试新的验证代码流。为此,您应该为您的tokenStore创建自己的AuthenticationKeyGenerator,如这里所述。

我已经在令牌增强器中处理了它。我只是得到新生成的访问令牌的到期时间和现有的刷新令牌的到期时间。如果访问令牌的到期时间大于刷新令牌的到期时间,则将更新访问令牌的到期时间以刷新令牌的到期时间。下面是我的代码示例。

public class CustomTokenEnhancer implements TokenEnhancer {
@Override
public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) {
ExpiringOAuth2RefreshToken refreshToken = ((ExpiringOAuth2RefreshToken)accessToken.getRefreshToken());
long refreshTokenExpiresIn = ((ExpiringOAuth2RefreshToken)accessToken.getRefreshToken()).getExpiration().getTime();
long accessTokenExpiresIn = accessToken.getExpiration().getTime();
LOGGER.info("RT {} and AT {}", refreshTokenExpiresIn, accessTokenExpiresIn);
if(accessTokenExpiresIn > refreshTokenExpiresIn) {
((DefaultOAuth2AccessToken) accessToken).setExpiration(refreshToken.getExpiration());
}
((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(additionalInformation);
return accessToken;
}
}
以下是如何在配置中设置TokenEnhancer:
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfiguration implements AuthorizationServerConfigurer {
@Bean
public TokenEnhancer tokenEnhancer() {
return new CustomTokenEnhancer();
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.tokenEnhancer(tokenEnhancer());
}
}

最新更新