[英]How to refresh OAuth2 token with Spring Security 5 OAuth2 client and RestTemplate
Spring Security 5.1.0.M2( 發行說明)在使用WebClient
時添加了對令牌自動刷新的支持。 但是,我正在使用RestTemplate
。 RestTemplate
是否有類似的機制,還是我需要自己實現該行為?
OAuth2RestTemplate
類看起來很有前途,但它來自單獨的 Spring Security OAuth 模塊,如果可能的話,我想在客戶端上使用普通的 Spring Security 5.1。
OAuth2RestTemplate
將自動刷新令牌。 RestTemplate
不會(刷新令牌是 OAuth2 規范的一部分,因此 OAuth2RestTemplate.
您有 2 個選擇:
Spring 的 OAuth2 模塊將來會集成到 Spring Security 中。 我會選擇選項 1。
OAuth2RestTemplate
應改為使用的RestTemplate
時,需要JWT認證。 您可以將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
,如果有人知道如何做到這一點 - 請分享。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.