我正在尝试使用以下代码在春季启动时创建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;
}
答案 0 :(得分:0)
缓存机制违反Oauth2 RFC,因为此标准提供了安全边界,可以保护处于中间攻击状态的任何人CSRF,XSS...。
因此,oauth2规范包含以下身份验证概念:
客户端凭据
授权码
访问令牌和刷新令牌
您的用例是访问令牌,刷新令牌用例(Oauth2是围绕此概念构建的),因此,对于每个访问令牌,您都有一个到期日期,并且服务器发出了一个刷新令牌(具有更长的到期日期)以获得新的acces_token。
因此缓存部分将不遵守oauth2标准,因为它可能导致安全问题,例如中级攻击者。
根据您的问题,客户应该能够自己做到:
将访问令牌发送到后端
如果访问令牌过期或无效,则请求新的刷新令牌