【问题标题】:Java POST request to get token from web service从 Web 服务获取令牌的 Java POST 请求
【发布时间】:2017-08-15 06:34:28
【问题描述】:

我需要从 java 应用程序访问一些使用基于令牌的身份验证的 RESTful Web 服务。据我了解,为此目的的最佳选择是使用基于 JAX-RS 的库,如 Jersey,但我对这件事很陌生。也许有人可以通过给出正确请求的示例代码来帮助我从 Web 服务获取令牌。

我们有什么:

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

据我了解,要获得令牌,我必须发送 POST 请求以及以下标头:

  • “授权”、“基本 YWRhMGI3NTicdscsN2I0MjNjM2EwNWQ0MjM2ZTg6QU1hS0ltUEZJaUFSR3dGMmJ3NjZZVi9Ec05YZTd0ZkEerfrvegezNoND0="(“基本” + base64 编码的“clientId:clientSecret”)
  • “接受”、“application/x-www-form-urlencoded”
  • “内容类型”、“应用程序/json;odata=verbose”

还有以下参数:

grant_type=password&username=someusername&password=somepassword&scope=profile

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

【问题讨论】:

    标签: java rest web-services httpurlconnection


    【解决方案1】:

    已解决!

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

    【讨论】:

      【解决方案2】:

      几点:

      • 您指定的 URL 请求属于 Resource Owner Password Credentials Grant。确保您处于此赠款的适用场景(更多详情here)。
      • JAX-RS 是关于实现 REST api,而不是关于客户端调用(也许您在谈论“jax-rs 客户端”?如果是这样的话,就 oauth 而言,它属于我的最后一点类别与任何其他 http 客户端一样)。
      • 有些库可以为您处理获取访问令牌,因此您只需提供属性并决定如何处理生成的令牌。例如,如果您可以使用 spring,Spring Security OAuth2(仅谈论“客户端角色”配置;您将使用外部授权服务器)。
      • 如果这些库不适合您的情况:您只需实现/使用 http 客户端对授权服务器进行标准调用(它们只是 REST api)。一些选项:apache httpcomponentsSpring RestTemplatejdk HttpUrlConnection

      【讨论】:

      • 还有一个JAX-RX Client API(主要用于但不限于REST)可能会增加一些混乱。
      • 你是对的 thnx,将编辑答案以避免混淆(在任何情况下,OP 都谈到了与服务实现相关的球衣,而不是与客户 afaik)。恕我直言,jax-rs 客户端是一个糟糕的名称,考虑到文档本身声明客户端不是用于 jaxrs 服务,而是用于任何 REST 服务:p
      • 更糟糕的是,Jersey 作为一个 JAX-RS 实现,也在一个名为 jersey-client 的组件中实现了 JAX-RS 客户端 API。
      • 哈哈好吧,完全删除了“球衣不是客户”的评论
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 2017-10-18
      • 2017-12-21
      • 2013-04-19
      • 2021-03-21
      • 1970-01-01
      相关资源
      最近更新 更多