springoauth2访问令牌到期时间更新每个令牌

ogsagwnx  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(481)

我有一个授权服务器和多个oauth2资源服务器。所有这些都是使用springsecurityoauth2实现的。我还有使用授权代码流生成令牌的前端客户机。
我的情况是,如果刷新令牌的有效期是2小时,而访问令牌的有效期是1小时。首先获取令牌没有问题(两个令牌都是新的。1小时后,访问令牌过期。现在假设应用程序仅在另外30分钟(经过1.5小时)后使用现有刷新令牌重试新的访问令牌,并且生成新的访问令牌,有效期为1小时,比刷新令牌多出30分钟。在前端,我将令牌存储在cookies中,刷新令牌在30分钟后被删除。当我再次尝试使用auth代码流新获取令牌时,springoauth2服务器返回相同的过期刷新令牌和活动访问令牌。我的应用程序进入一个混乱的状态,即用户是否被授权,因为它只有访问令牌,即使在几次重试。
是否可以生成到期时间始终小于或等于刷新令牌的访问令牌?

h22fl7wq

h22fl7wq1#

你应该换个新的 access_token 以及 refresh_token 当您尝试使用新的身份验证代码流时。为此,你应该创建自己的 AuthenticationKeyGenerator 这里提到的代币店。

bqucvtff

bqucvtff2#

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

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

}

相关问题