oAuth客户端未缓存令牌

时间:2020-02-24 14:12:13

标签: spring spring-boot spring-security

我正在尝试使用以下代码在春季启动时创建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;
}

1 个答案:

答案 0 :(得分:0)

缓存机制违反Oauth2 RFC,因为此标准提供了安全边界,可以保护处于中间攻击状态的任何人CSRF,XSS...。

因此,oauth2规范包含以下身份验证概念:

  1. 客户端凭据

  2. 授权码

  3. 访问令牌和刷新令牌

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

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

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

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

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

相关问题