【问题标题】:Spring OAuth2 Access Token expiry time update per token每个令牌的 Spring OAuth2 访问令牌到期时间更新
【发布时间】:2021-06-05 00:51:15
【问题描述】:

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

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

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

【问题讨论】:

    标签: java spring spring-boot spring-security oauth-2.0


    【解决方案1】:

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

    【讨论】:

    • 这很好,也很复杂。如果我必须发布新的刷新和访问令牌,当用户在多个设备中授权时会发生什么?现有的代币呢?
    • "如果我必须发布新的刷新和访问令牌,当用户在多个设备中授权时会发生什么?" 这取决于用例。根据上述查询,这意味着您正在使用来自不同客户端的相同身份验证属性并希望获得相同的令牌。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-01-04
      • 2017-04-14
      • 2017-04-11
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      • 2017-12-02
      相关资源
      最近更新 更多