2017-08-15 55 views
0

我需要從Java應用程序訪問某些使用基於令牌的身份驗證的RESTful Web服務。正如我所理解的,爲此目的的最佳選擇是使用像Jersey這樣的基於JAX-RS的庫,但我對這個問題非常陌生。也許有人可以通過給出適當請求的示例代碼來幫助我從Web服務獲取令牌。從Web服務獲取令牌的Java POST請求

我們有什麼:

令牌發佈服務器的
  • URI。它使用oAuth2授權。
  • clientId和clientSecret。我們必須將它們提交給令牌發佈服務器,該服務器將驗證它們並返回令牌。
  • Web服務本身的URI。
  • 服務訪問的用戶名和密碼。

我的理解,得到令牌我必須與下列頭一起發送POST請求:

  • 「授權」, 「基本 YWRhMGI3NTicdscsN2I0MjNjM2EwNWQ0MjM2ZTg6QU1hS0ltUEZJaUFSR3dGMmJ3NjZZVi9Ec05YZTd0ZkEerfrvegezNoND0 =」( 「基本」 + base64編碼「的clientId:clientSecret「)
  • 」接受「, 」應用程序/ x WWW的形式進行了urlencoded「
  • 」內容類型「, 」應用/ JSON;的OData =詳細「

及以下參數:

grant_type =密碼&用戶名= someusername &密碼= somepassword &範圍=輪廓

希望有人能幫助我與示例代碼。

回答

0

幾點:

指定
  • URL請求是屬於資源所有者密碼憑據的一個授權。確保你在這個授權的情況下(更多詳情here)。
  • JAX-RS是關於實現REST apis,而不是關於客戶端調用(也許你在談論「jax-rs客戶端」?如果是這種情況,就oauth而言,它屬於我的最後一個類別與任何其他http客戶端一樣)。
  • 有些庫可以爲您處理獲取訪問令牌,因此您只需提供屬性並決定如何處理生成的令牌。例如,如果您確定使用spring,Spring Security OAuth2(僅討論「客戶端角色」配置;您將使用外部授權服務器)。
  • 如果這些庫不適合您的情況:您只需實現/使用http客戶端對該授權服務器執行標準調用(它們只是REST API)。一些選項:阿帕奇httpcomponents春RestTemplateJDK HttpURLConnection的
+0

還有一個[JAX-RX客戶端API](https://docs.oracle.com/javaee/7/tutorial/jaxrs-client.htm)(主要用於,但不限於REST )這可能會增加一些混淆。 – toKrause

+0

你是對的thnx,將編輯答案,以避免混淆(在任何情況下,OP談到與服務實施有關的球衣,而不是客戶端afaik)。恕我直言,jax-rs客戶端是一個糟糕的名字,考慮到文檔本身指出客戶端不是用於jaxrs服務,而是用於任何REST服務:p –

+0

由於Jersey作爲JAX-RS實現,情況更糟糕,還在名爲'jersey-client'的組件中實現了JAX-RS客戶端API。 – toKrause

0

解決!

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.net.HttpURLConnection; 
import java.net.URL; 

public void getHttpCon() throws Exception{ 

    String POST_PARAMS = "grant_type=password&username=someusrname&password=somepswd&scope=profile"; 
    URL obj = new URL("http://someIP/oauth/token"); 
    HttpURLConnection con = (HttpURLConnection) obj.openConnection(); 
    con.setRequestMethod("POST"); 
      con.setRequestProperty("Content-Type", "application/json;odata=verbose"); 
    con.setRequestProperty("Authorization", 
      "Basic Base64_encoded_clientId:clientSecret"); 
    con.setRequestProperty("Accept", 
      "application/x-www-form-urlencoded"); 

    // For POST only - START 
    con.setDoOutput(true); 
    OutputStream os = con.getOutputStream(); 
    os.write(POST_PARAMS.getBytes()); 
    os.flush(); 
    os.close(); 
    // For POST only - END 

    int responseCode = con.getResponseCode(); 
    System.out.println("POST Response Code :: " + responseCode); 

    if (responseCode == HttpURLConnection.HTTP_OK) { //success 
     BufferedReader in = new BufferedReader(new InputStreamReader(
       con.getInputStream())); 
     String inputLine; 
     StringBuffer response = new StringBuffer(); 

     while ((inputLine = in.readLine()) != null) { 
      response.append(inputLine); 
     } 
     in.close(); 

     // print result 
     System.out.println(response.toString()); 
    } else { 
     System.out.println("POST request not worked"); 
    } 
}