2017-09-07 117 views
1

我正在使用Spring RestTemplate向OAuth2受保護的資源服務器發出請求。以下是初始化REST模板的代碼。RestTemplate通過GET請求而不是POST的OAuth2請求訪問令牌

ResourceOwnerPasswordResourceDetails resourceDetails = new ResourceOwnerPasswordResourceDetails(); 
resourceDetails.setUsername(userName); 
resourceDetails.setPassword(password); 
resourceDetails.setAccessTokenUri(root + accessTokenURI); 
resourceDetails.setClientId(clientId); 
resourceDetails.setClientSecret(clientSecret); 
resourceDetails.setGrantType(grantType); 
resourceDetails.setScope(Arrays.asList(scope)); 

DefaultOAuth2ClientContext clientContext = new DefaultOAuth2ClientContext(); 

RestTemplate rest = new OAuth2RestTemplate(resourceDetails, clientContext); 

RestTemplate默認使用POST請求從授權服務器獲得access_token。我有一個獨特的要求。我想讓RestTemplate使用GET以獲得access_token而不是POST。有沒有可以修改這種行爲的配置?

回答

3

在查看spring-security-oauth項目的內部結構後,我找到了解決方案。它要求覆蓋ResourceOwnerPasswordAccessTokenProvider課程並在OAuth2RestTemplate課程中將其設置爲AccessTokenProvider。這是怎麼回事。

package com.acme; 

import org.springframework.http.HttpMethod; 

public class ResourceOwnerPasswordAccessTokenProvider extends org.springframework.security.oauth2.client.token.grant.password.ResourceOwnerPasswordAccessTokenProvider { 

    @Override 
    protected HttpMethod getHttpMethod() { 
    return HttpMethod.GET; 
    } 
} 

,當你初始化OAuth2RestTemplate

ResourceOwnerPasswordResourceDetails resourceDetails = new ResourceOwnerPasswordResourceDetails(); 
resourceDetails.setUsername(userName); 
resourceDetails.setPassword(password); 
resourceDetails.setAccessTokenUri(root + accessTokenURI); 
resourceDetails.setClientId(clientId); 
resourceDetails.setClientSecret(clientSecret); 
resourceDetails.setGrantType(grantType); 
resourceDetails.setScope(Arrays.asList(scope)); 

DefaultOAuth2ClientContext clientContext = new DefaultOAuth2ClientContext(); 

OAuth2RestTemplate rest = new OAuth2RestTemplate(resourceDetails, clientContext); 

// Set the overridden ResourceOwnerPasswordAccessTokenProvider class instance to OAuth2RestTemplate 
AccessTokenProvider accessTokenProvider = new com.acme.ResourceOwnerPasswordAccessTokenProvider(); 
rest.setAccessTokenProvider(accessTokenProvider);