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

时间:2017-08-15 06:34:28

标签: java rest web-services httpurlconnection

我需要从java应用程序访问一些使用基于令牌的身份验证的RESTful Web服务。据我所知,为此目的的最佳选择是使用像泽西岛这样的基于JAX-RS的库,但我对这个问题很新。也许有人可以通过提供适当请求的示例代码来帮助我从Web服务获取令牌。

我们拥有什么:

  • 令牌发布服务器的URI。它使用oAuth2授权。
  • clientId和clientSecret。我们必须将它们提交给令牌发布服务器,该服务器将验证它们并返回令牌。
  • Web服务本身的URI。
  • 服务访问的用户名和密码。

据我所知,要获取令牌,我必须发送POST请求以及以下标题:

  • "授权","基本 YWRhMGI3NTicdscsN2I0MjNjM2EwNWQ0MjM2ZTg6QU1hS0ltUEZJaUFSR3dGMmJ3NjZZVi9Ec05YZTd0ZkEerfrvegezNoND0 =" (" Basic" + base64编码" clientId:clientSecret")
  • "接受"," application / x-www-form-urlencoded"
  • " Content-Type"," application / json; odata = verbose"

和以下参数:

grant_type =密码&安培;用户名= someusername&安培;密码= somepassword&安培;范围=简档

希望有人能帮我提供示例代码。

2 个答案:

答案 0 :(得分:0)

有些观点:

  • 您指定的URL请求是属于资源所有者密码凭据授权的URL请求。请确保您处于此授权所针对的情况下(更多详情here)。
  • JAX-RS是关于实现REST apis,而不是关于客户端调用(也许你在谈论“jax-rs客户端”?如果是这样的话,就oauth来说,它属于我的最后一点类别和任何其他http客户端一样。)
  • 有些库可以为您处理获取访问令牌,因此您只需提供属性并决定如何处理生成的令牌。例如,如果您使用spring, Spring Security OAuth2 (仅讨论“客户端角色”配置;您将使用外部授权服务器)。
  • 如果这些库不适合您的情况:您只需要实现/使用http客户端对该授权服务器进行标准调用(它们只是REST api)。一些选项: apache httpcomponents Spring RestTemplate jdk HttpUrlConnection

答案 1 :(得分: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");
    }
}