2017-01-16 24 views
1

私は、Restful Oauth2サービスを使用するためにSpring Boot + Spring Security OAuth2を使用しています。なぜOAuth2AccessTokenSupportは常にPOSTリクエストを送信するのですか?

私たちのOauth2サービスは常にHTTP GETを期待していますが、OAuth2AccessTokenSupportは常にHTTP POSTを送信します。

結果:

は405(メソッド許可されていません)が生じました。エラーハンドラを呼び出す

protected OAuth2AccessToken retrieveToken(AccessTokenRequest request, OAuth2ProtectedResourceDetails resource, 
     MultiValueMap<String, String> form, HttpHeaders headers) throws OAuth2AccessDeniedException { 
    try { 
     this.authenticationHandler.authenticateTokenRequest(resource, form, headers); 

     this.tokenRequestEnhancer.enhance(request, resource, form, headers); 
     AccessTokenRequest copy = request; 

     ResponseExtractor delegate = getResponseExtractor(); 
     ResponseExtractor extractor = new ResponseExtractor(copy, delegate) { 
      public OAuth2AccessToken extractData(ClientHttpResponse response) throws IOException { 
       if (response.getHeaders().containsKey("Set-Cookie")) { 
        this.val$copy.setCookie(response.getHeaders().getFirst("Set-Cookie")); 
       } 
       return ((OAuth2AccessToken) this.val$delegate.extractData(response)); 
      } 
     }; 
     return ((OAuth2AccessToken) getRestTemplate().execute(getAccessTokenUri(resource, form), getHttpMethod(), 
       getRequestCallback(resource, form, headers), extractor, form.toSingleValueMap())); 
    } catch (OAuth2Exception oe) { 
     throw new OAuth2AccessDeniedException("Access token denied.", resource, oe); 
    } catch (RestClientException rce) { 
     throw new OAuth2AccessDeniedException("Error requesting access token.", resource, rce); 
    } 
} 

<b>protected HttpMethod getHttpMethod() { 
    return HttpMethod.POST; 
}</b> 

protected String getAccessTokenUri(OAuth2ProtectedResourceDetails resource, MultiValueMap<String, String> form) { 
    String accessTokenUri = resource.getAccessTokenUri(); 

    if (this.logger.isDebugEnabled()) { 
     this.logger.debug(new StringBuilder().append("Retrieving token from ").append(accessTokenUri).toString()); 
    } 

    StringBuilder builder = new StringBuilder(accessTokenUri); 
    String separator; 
    if (getHttpMethod() == HttpMethod.GET) { 
     separator = "?"; 
     if (accessTokenUri.contains("?")) { 
      separator = "&"; 
     } 

     for (String key : form.keySet()) { 
      builder.append(separator); 
      builder.append(new StringBuilder().append(key).append("={").append(key).append("}").toString()); 
      separator = "&"; 
     } 
    } 

    return builder.toString(); 
} 

OAuth2AccessTokenSupportは常に、あなたが追加する必要がHTTP GETリクエスト

答えて

0

はトークンエンドポイントのGETリクエストを有効にするに送信するためにどのようにPOSTと を返し、なぜ誰もが私を説明できますAuthorizationServerConfigurerAdapter:

@Override 
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { 
    endpoints.allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST); 
} 

なぜPOSTはデフォルトでどうですか?これは、GET要求がリクエストパラメータとしてユーザー名とパスワード情報を送信する可能性があるためです(これは確かにパスワード付与のケースです)。これらはWebサーバーのログに表示され、POST本体のデータは表示されません。

実際、OAuth2のRFCでは、クライアントがアクセストークンを要求するときにHTTP POSTを使用する必要があることを宣言しています(https://tools.ietf.org/html/rfc6749#section-3.2

関連する問題