从Web服务获取令牌的Java POST请求

问题描述:

我需要从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 &范围=轮廓

希望有人能帮助我与示例代码。

几点:

指定
  • 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

解决!

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"); 
    } 
}