【问题标题】:oAuth client not caching the tokenoAuth 客户端未缓存令牌
【发布时间】:2020-06-08 04:32:45
【问题描述】:

我正在尝试使用以下代码在 Spring Boot 中创建一个 oAuth 客户端。我尝试记录 getoken 方法。根据文档和代码,它还必须缓存令牌,我检查了其中的源代码,检查令牌是否为空或令牌是否过期,它正在尝试调用。但对我来说,每个电话都是用一个新的令牌来响应的。能否请您告诉我为什么不缓存它,它与上下文有什么关系吗?

@Bean
@ConfigurationProperties("app.oauth2.client")
protected ClientCredentialsResourceDetails oAuthDetails() {
    return new ClientCredentialsResourceDetails();
}

@Bean
protected OAuth2RestTemplate restTemplate() {
    return new OAuth2RestTemplate(oAuthDetails());
}

来自 Spring 源代码

/**
 * Acquire or renew an access token for the current context if necessary. This method will be called automatically
 * when a request is executed (and the result is cached), but can also be called as a standalone method to
 * pre-populate the token.
 * 
 * @return an access token
 */
public OAuth2AccessToken getAccessToken() throws UserRedirectRequiredException {

    OAuth2AccessToken accessToken = context.getAccessToken();

    if (accessToken == null || accessToken.isExpired()) {
        try {
            accessToken = acquireAccessToken(context);
        }
        catch (UserRedirectRequiredException e) {
            context.setAccessToken(null); // No point hanging onto it now
            accessToken = null;
            String stateKey = e.getStateKey();
            if (stateKey != null) {
                Object stateToPreserve = e.getStateToPreserve();
                if (stateToPreserve == null) {
                    stateToPreserve = "NONE";
                }
                context.setPreservedState(stateKey, stateToPreserve);
            }
            throw e;
        }
    }
    return accessToken;
}

【问题讨论】:

    标签: spring spring-boot spring-security


    【解决方案1】:

    缓存机制反对Oauth2 RFC,因为该标准提供了安全边界来保护任何中间人攻击、CSRF、XSS....

    所以 oauth2 规范包含以下认证概念:

    1. 客户凭证

    2. 授权码

    3. 访问令牌和刷新令牌

    您的用例是访问令牌、刷新令牌用例(Oauth2 是围绕这个概念构建的),因此对于每个访问令牌,您都有一个到期日期,以及一个由服务器发出的刷新令牌(具有更长的到期日期)获取一个新的accesss_token。

    因此缓存部分不遵守 oauth2 标准,因为它可能导致安全问题,例如中间人攻击。

    根据您的问题,客户应该能够自己:

    1. 将访问令牌发送到后端

    2. 如果访问令牌过期或无效,则请求新的刷新令牌

    【讨论】:

      猜你喜欢
      • 2021-03-12
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 2016-09-17
      • 2017-09-06
      • 1970-01-01
      • 2015-03-26
      • 2021-01-24
      相关资源
      最近更新 更多