簡體   English   中英

如何使用 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( 發行說明)在使用WebClient時添加了對令牌自動刷新的支持。 但是,我正在使用RestTemplate RestTemplate是否有類似的機制,還是我需要自己實現該行為?

OAuth2RestTemplate類看起來很有前途,但它來自單獨的 Spring Security OAuth 模塊,如果可能的話,我想在客戶端上使用普通的 Spring Security 5.1。

OAuth2RestTemplate將自動刷新令牌。 RestTemplate不會(刷新令牌是 OAuth2 規范的一部分,因此 OAuth2RestTemplate.

您有 2 個選擇:

  1. 使用 Spring Security OAuth2 模塊,一切都會開箱即用(Spring 提供的配置屬性)
  2. 基於 Spring 的 OAuth2RestTemplate 創建你自己的 RestTemplate

Spring 的 OAuth2 模塊將來會集成到 Spring Security 中。 我會選擇選項 1。

OAuth2RestTemplate應改為使用的RestTemplate時,需要JWT認證。 您可以將AccessTokenProvider設置為它,它將告訴如何檢索 JWT 令牌: oAuth2RestTemplate.setAccessTokenProvider(new MyAccessTokenProvider());

在實現AccessTokenProvider類中,您需要實現obtainAccessTokenrefreshAccessToken方法。 因此,在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM