Spring Security 5.1.0.M2(release notes)添加了对使用WebClient
时自动刷新令牌的支持。但是,我正在使用RestTemplate
。 RestTemplate
是否有类似的机制,还是我需要自己实现该行为?
OAuth2RestTemplate
类看起来很有希望,但它来自单独的Spring Security OAuth模块,如果可能的话,我想在客户端上使用纯Spring Security 5.1。
答案 0 :(得分:4)
.rspec
将自动刷新令牌。 --color
--format progress
--order random
--require rails_helper
不会(刷新令牌是OAut2规范的一部分,因此是OAuth2RestTemplate。
您有2个选项:
Spring的OAuth2模块将来会集成到Spring Security中。 我会选择选项1。
答案 1 :(得分:1)
OAuth2RestTemplate
代替RestTemplate
。您可以为其设置AccessTokenProvider
,这将告诉您如何检索JWT令牌:oAuth2RestTemplate.setAccessTokenProvider(new MyAccessTokenProvider());
在实现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
的方法-请分享。