如何使用 Spring Security 5 OAuth2 客户端和 RestTemplate 刷新 OAuth2 令牌
How to refresh OAuth2 token with Spring Security 5 OAuth2 client and RestTemplate
Spring Security 5.1.0.M2 (release notes) 添加了使用 WebClient
时自动刷新令牌的支持。但是,我正在使用 RestTemplate
。 RestTemplate
是否有类似的机制,或者我是否需要自己实现该行为?
OAuth2RestTemplate
class 看起来很有前途,但它来自单独的 Spring Security OAuth 模块,如果可能的话,我想在客户端上使用纯 Spring Security 5.1 .
OAuth2RestTemplate
将自动刷新令牌。 RestTemplate
不会(刷新令牌是 OAut2 规范的一部分,因此是 OAuth2RestTemplate。
您有 2 个选择:
- 使用 Spring Security OAuth2 模块,一切都将开箱即用(Spring 提供的配置属性)
- 基于Spring的OAut2RestTemplate
创建你自己的RestTemplate
Spring 的 OAuth2 模块将来会集成到 Spring Security 中。
我会选择选项 1。
当需要 JWT 身份验证时,应使用 OAuth2RestTemplate
而不是 RestTemplate
。您可以为其设置 AccessTokenProvider
,这将告诉您如何检索 JWT 令牌:oAuth2RestTemplate.setAccessTokenProvider(new MyAccessTokenProvider());
在 class 中实现 AccessTokenProvider
您需要实现 obtainAccessToken
和 refreshAccessToken
方法。所以在 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
的方法,如果有人知道该怎么做 - 请分享。
Spring Security 5.1.0.M2 (release notes) 添加了使用 WebClient
时自动刷新令牌的支持。但是,我正在使用 RestTemplate
。 RestTemplate
是否有类似的机制,或者我是否需要自己实现该行为?
OAuth2RestTemplate
class 看起来很有前途,但它来自单独的 Spring Security OAuth 模块,如果可能的话,我想在客户端上使用纯 Spring Security 5.1 .
OAuth2RestTemplate
将自动刷新令牌。 RestTemplate
不会(刷新令牌是 OAut2 规范的一部分,因此是 OAuth2RestTemplate。
您有 2 个选择:
- 使用 Spring Security OAuth2 模块,一切都将开箱即用(Spring 提供的配置属性)
- 基于Spring的OAut2RestTemplate 创建你自己的RestTemplate
Spring 的 OAuth2 模块将来会集成到 Spring Security 中。 我会选择选项 1。
OAuth2RestTemplate
而不是 RestTemplate
。您可以为其设置 AccessTokenProvider
,这将告诉您如何检索 JWT 令牌:oAuth2RestTemplate.setAccessTokenProvider(new MyAccessTokenProvider());
在 class 中实现 AccessTokenProvider
您需要实现 obtainAccessToken
和 refreshAccessToken
方法。所以在 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
的方法,如果有人知道该怎么做 - 请分享。