2014-05-06 45 views
1

我試圖讓2腿Oauth 2工作。我試圖模仿這種捲曲調用來獲取訪問令牌:使用2腿Oauth 2.0和Apache OauthClient訪問令牌

curl -u CLIENT_ID:CLIENT_SECRET https://mydomain.com/token -d "grant_type=client_credentials" 

我試圖做使用Apache Oltu在Java中同樣的事情:

<dependency> 
    <groupId>org.apache.oltu.oauth2</groupId> 
    <artifactId>org.apache.oltu.oauth2.client</artifactId> 
    <version>1.0.0</version> 
</dependency> 

這是Java代碼中,我「M使用:

OAuthClientRequest request = OAuthClientRequest 
      .tokenLocation("https://mydomain.com/token") 
      .setGrantType(GrantType.CLIENT_CREDENTIALS) 
      .setClientId(CLIENT_ID) 
      .setClientSecret(CLIENT_SECRET) 
      .buildBodyMessage(); 


//create OAuth client that uses custom http client under the hood 
OAuthClient oAuthClient = new OAuthClient(new URLConnectionClient()); 

OAuthJSONAccessTokenResponse oAuthResponse = oAuthClient.accessToken(request, OAuthJSONAccessTokenResponse.class); 

curl命令工作正常,但在Java代碼中給出了這樣的錯誤:

OAuthProblemException{error='invalid_request', description='Must include a basic access authentication header.', uri='null', state='null', scope='null', redirectUri='null', responseStatus=0, parameters={}} 

我嘗試使用標頭消息構建:

​​

代替,但它給:

OAuthProblemException{error='invalid_request', description='Must specify grant_type field.', uri='null', state='null', scope='null', redirectUri='null', responseStatus=0, parameters={}} 

任何建議都理解的。我希望這很簡單。

+0

小晚,但對於那些有興趣,你可以嘗試通過buildQueryMessage改變buildBodyMessage()() – vicmac

回答

1

我放棄了Apache Oltu Oauth並提出了兩個備用解決方案。後者是首選。

解決方案1:低電平HTTP調用

對於我的第一次嘗試,我回到基礎知識和使用的HttpClient庫。

<dependency> 
    <groupId>org.apache.httpcomponents</groupId> 
    <artifactId>httpclient</artifactId> 
    <version>4.3.3</version> 
</dependency> 

我可以使用下面的代碼來獲取OAuth訪問令牌:

HttpPost request = new HttpPost("https://mydomain.com/token"); 
List<NameValuePair> urlParameters = new ArrayList<NameValuePair>(); 
urlParameters.add(new BasicNameValuePair("grant_type", "client_credentials")); 
request.setEntity(new UrlEncodedFormEntity(urlParameters)); 

String auth = CLIENT_ID + ":" + CLIENT_SECRET; 
byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(Charset.forName("US-ASCII"))); 
String authHeader = "Basic " + new String(encodedAuth); 
request.setHeader(HttpHeaders.AUTHORIZATION, authHeader); 

HttpClient client = HttpClientBuilder.create().build(); 
HttpResponse response = client.execute(request); 
System.out.println("Oauth Access Token" + EntityUtils.toString(response.getEntity())); 

解決方案2:春天的oauth2 RestTemplate

我懷疑必須有一個更好的方式做雙腿Oauth 2.0,很高興能找到Spring Oauth2框架

<dependency> 
    <groupId>org.springframework.security.oauth</groupId> 
    <artifactId>spring-security-oauth2</artifactId> 
    <version>1.0.5.RELEASE</version> 
</dependency> 

這會產生更簡單的代碼,併爲隨後的REST調用提供框架。這個代碼可以使用Jackson來清理,但我決定保持簡單。

String CLIENT_SECRET = "xxxx"; 
String CLIENT_ID = "yyyy"; 

ClientCredentialsResourceDetails resourceDetails = new ClientCredentialsResourceDetails(); 
resourceDetails.setClientSecret(CLIENT_SECRET); 
resourceDetails.setClientId(CLIENT_ID); 
resourceDetails.setAccessTokenUri("https://mydomain.com/token"); 

OAuth2RestTemplate oAuthRestTemplate = new OAuth2RestTemplate(resourceDetails); 

HttpHeaders headers = new HttpHeaders(); 
headers.setContentType(MediaType.APPLICATION_JSON); 

// Sample POST Method 
String postJson = "{\"phone\":\"15554443333\", \"ip\":\"67.666.666.666\"}"; 
HttpEntity<String> reqEntity = new HttpEntity<String>(postJson, headers); 
String postUri = "https://mydomain.com/v1.0/phone.json"; 
String postResult = oAuthRestTemplate.postForObject(postUri, reqEntity, String.class); 
System.out.println(postResult); 

// Sample GET method 
String getUri = "https://mydomain.com/v1.0/phone.json?phone=15554443333"; 
String result = oAuthRestTemplate.getForObject(getUri, String.class); 
System.out.println(result); 
+1

謝謝,使用Apache Oltu您建議的「解決方案-1」在我的情況是工作的罰款。但我看不出有什麼辦法讓你的「解決方案-2」工作。您能否重新驗證代碼片段並更新最新的Maven依賴關係?這將是很好,如果你可以提供示例代碼 – Prateek

0

最近,我試圖找到一個OAuth2 java庫來獲取「client_credential」類型的accesstoken。下面是我所擁有的,似乎它確實有效。

@Test 
public void getAccessTokenViaApacheOltuOAuthClient() { 
    try{ 

     OAuthClient client = new OAuthClient(new URLConnectionClient()); 

     OAuthClientRequest request = 
       OAuthClientRequest.tokenLocation(TOKEN_REQUEST_URL) 
         .setGrantType(GrantType.CLIENT_CREDENTIALS) 
         .setClientId(CLIENT_ID) 
         .setClientSecret(CLIENT_SECRET) 
         .setScope(StringUtils.join(TEST_SCOPES, " ")) //if you have scope 
         .buildBodyMessage(); 

     String token = 
       client.accessToken(request, "POST", OAuthJSONAccessTokenResponse.class) 
         .getAccessToken(); 

     System.out.println(token); 
     assertTrue(token != null); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
+0

可能有人請回答這個問題https://stackoverflow.com/questions/46436388/spring-mvc-apache-oltu-and-salesforce-integration-examples? – Prateek