如何使用Spring Security 5 OAuth2客户端和RestTemplate刷新OAuth2令牌

时间:2018-09-27 09:01:12

标签: java spring spring-boot spring-security spring-security-oauth2

Spring Security 5.1.0.M2(release notes)添加了对使用WebClient时自动刷新令牌的支持。但是,我正在使用RestTemplateRestTemplate是否有类似的机制,还是我需要自己实现该行为?

OAuth2RestTemplate类看起来很有希望,但它来自单独的Spring Security OAuth模块,如果可能的话,我想在客户端上使用纯Spring Security 5.1。

2 个答案:

答案 0 :(得分:4)

.rspec将自动刷新令牌。 --color --format progress --order random --require rails_helper 不会(刷新令牌是OAut2规范的一部分,因此是OAuth2RestTemplate。

您有2个选项:

  1. 使用Spring Security OAuth2模块,一切将立即可用(Spring提供的配置属性)
  2. 基于Spring的OAut2RestTemplate创建您自己的RestTemplate

Spring的OAuth2模块将来会集成到Spring Security中。 我会选择选项1。

答案 1 :(得分:1)

需要JWT身份验证时,应使用

OAuth2RestTemplate代替RestTemplate。您可以为其设置AccessTokenProvider,这将告诉您如何检索JWT令牌:oAuth2RestTemplate.setAccessTokenProvider(new MyAccessTokenProvider());

在实现AccessTokenProvider的类中,您需要实现obtainAccessTokenrefreshAccessToken方法。因此,在obtainAccessToken方法中,可以检查令牌是否已过期,如果令牌已过期,则可以通过-refreshAccessToken来检索令牌。实施示例(不包含实际令牌检索和刷新的详细信息):

public class MyAccessTokenProvider implements AccessTokenProvider {

    @Override
    public OAuth2AccessToken obtainAccessToken(OAuth2ProtectedResourceDetails details, AccessTokenRequest parameters)
        throws UserRedirectRequiredException, UserApprovalRequiredException, AccessDeniedException {
        if (parameters.getExistingToken() != null && parameters.getExistingToken().isExpired()) {
            return refreshAccessToken(details, parameters.getExistingToken().getRefreshToken(), parameters);
        }

        OAuth2AccessToken retrievedAccessToken = null;
        //TODO access token retrieval
        return retrievedAccessToken;
    }

    @Override
    public boolean supportsResource(OAuth2ProtectedResourceDetails resource) {
        return false;
    }

    @Override
    public OAuth2AccessToken refreshAccessToken(OAuth2ProtectedResourceDetails resource,
                                                OAuth2RefreshToken refreshToken, AccessTokenRequest request)
        throws UserRedirectRequiredException {

        OAuth2AccessToken refreshedAccessToken = null;
        //TODO refresh access token
        return refreshedAccessToken;
    }

    @Override
    public boolean supportsRefresh(OAuth2ProtectedResourceDetails resource) {
        return true;
    }
}

如果有人知道该怎么做,Spring找不到自动调用refreshAccessToken的方法-请分享。