繁体   English   中英

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

[英]Spring OAuth2 Access Token expiry time update per token

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

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

是否可以生成过期时间总是小于或等于刷新令牌的访问令牌?

当您尝试使用新的身份验证代码流时,您应该获得一个新的access_tokenrefresh_token 为此,您应该为您的 tokenStore 创建自己的AuthenticationKeyGenerator ,如此所述。

我已经在 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());
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM