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

从web服务获取令牌的Java POST请求,java,rest,web-services,httpurlconnection,Java,Rest,Web Services,Httpurlconnection,我需要从java应用程序访问某个RESTful web服务,该服务使用基于令牌的身份验证。据我所知,实现这一目的的最佳选择是使用基于JAX-RS的库,如Jersey,但我对这一点非常陌生。也许有人可以帮助我,给出从web服务获取令牌的正确请求的示例代码 我们所拥有的: 令牌颁发服务器的URI。它使用oAuth2授权 clientId和clientSecret。我们必须将它们提交给令牌颁发服务器,该服务器将验证它们并返回令牌 web服务本身的URI 服务访问的用户名和密码 据我所知,要获得令牌

我需要从java应用程序访问某个RESTful web服务,该服务使用基于令牌的身份验证。据我所知,实现这一目的的最佳选择是使用基于JAX-RS的库,如Jersey,但我对这一点非常陌生。也许有人可以帮助我,给出从web服务获取令牌的正确请求的示例代码

我们所拥有的:

  • 令牌颁发服务器的URI。它使用oAuth2授权
  • clientId和clientSecret。我们必须将它们提交给令牌颁发服务器,该服务器将验证它们并返回令牌
  • web服务本身的URI
  • 服务访问的用户名和密码
据我所知,要获得令牌,我必须发送POST请求以及以下标题:

  • “授权”、“基本” YWRHMGI3NTICDSCSN2I0MJNJM2EWNWQ0MJM2ZTG6QU1HS0LTUEZJAUFSR3DGMMJ3NJZZVI9EC05YZTD0ZKEERFRVEGEZOND0=“(“基本”+base64编码的“clientId:clientSecret”)
  • “接受”、“应用程序/x-www-form-urlencoded”
  • “内容类型”,“应用程序/json;odata=verbose”
和以下参数:

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

希望有人能在示例代码方面帮助我。

一些要点:

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

  • 您指定的URL请求属于资源所有者密码凭据授予。请确保您处于该补助金适用的情景下(更多详细信息)
  • JAX-RS是关于实现RESTAPI的,而不是关于客户端调用的(也许你说的是“JAX-RS客户端”?如果是这样的话,就oauth而言,它和任何其他http客户端一样属于我的最后一点类别)
  • 有一些库可以为您处理获取访问令牌的问题,因此您只需要提供属性并决定如何处理生成的令牌。例如,如果您可以使用spring、spring Security OAuth2(仅讨论“客户机角色”配置;您将使用外部授权服务器)
  • 如果这些库不适合您的情况:您只需要实现/使用http客户机对授权服务器进行标准调用(它们只是RESTAPI)。一些选项:ApacheHttpComponents、SpringRestTemplate、JDKHttpUrlConnection
    • 已解决

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

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

      还有一个(主要用于但不限于REST)可能会增加一些混淆。您是对的,thnx将编辑答案以避免混淆(在任何情况下,OP讨论的是与服务实现相关的jersey,而不是与客户端afaik)。IMHO jax-rs客户端是一个可怕的名字,考虑到文档本身声明该客户端不是用于jax-rs服务,而是用于任何REST服务:pIt变得更糟,因为Jersey作为jax-rs实现,也在名为
      Jersey client
      的组件中实现jax-rs客户端API。哈哈,okok,已删除“jersey not being client”(泽西岛不是客户)评论还有一个(主要用于但不限于REST)可能会增加一些混淆。您是对的,thnx将编辑答案以避免混淆(在任何情况下,OP谈论的是与服务实现相关的泽西岛,而不是与客户afaik相关的泽西岛).IMHO jax rs客户端是一个可怕的名字,考虑到文档本身声明客户端不是用于jax rs服务,而是用于任何REST服务:pIt变得更糟,因为Jersey作为jax-rs实现,也在名为
      Jersey client
      的组件中实现jax-rs客户端API。哈哈,好的,删除d“泽西岛不是客户”的评论