【问题标题】:How to refresh OAuth2 token with Spring Security 5 OAuth2 client and RestTemplate如何使用 Spring Security 5 OAuth2 客户端和 RestTemplate 刷新 OAuth2 令牌
【发布时间】:2019-03-03 03:30:35
【问题描述】:

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

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

【问题讨论】:

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


【解决方案1】:

OAuth2RestTemplate 会自动刷新令牌。 RestTemplate 不会(刷新令牌是 OAut2 规范的一部分,因此是 OAuth2RestTemplate。

你有两个选择:

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

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

【讨论】:

  • 你能指出一个官方文档说令牌自动刷新。对于我的授权代码授权类型的应用程序,它们没有被刷新,并且在 1 小时后停止工作(访问令牌的到期时间)
  • @Nikhil 对我来说发生了同样的事情。 accessToken 过期后应用程序停止工作。你设法解决了这个问题吗?
  • @Minisha 需要更改某些配置(不记得确切),以便在身份验证令牌过期时控制流自动进入刷新令牌流。使用OAuth2RestTemplate 并进入控制流进行调试。
【解决方案2】:

当需要 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 的方法,如果有人知道该怎么做 - 请分享。

【讨论】:

  • 你找到调用refreshAccessToken的方法了吗?
  • @Minisha,不,继续使用此答案中描述的解决方案。
  • 访问令牌检索在这里你写了一个restTemplate调用来获取令牌是不是?
  • 你能分享回购吗?当令牌过期时,我得到 401
  • @Minisha,要检索令牌,您只需向身份验证服务发送一个简单的帖子
猜你喜欢
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
  • 2020-04-19
  • 2012-07-21
相关资源
最近更新 更多