Java OAuth 2.0获取访问令牌

Java OAuth 2.0获取访问令牌,java,rest,curl,oauth-2.0,collabnet,Java,Rest,Curl,Oauth 2.0,Collabnet,我想通过Java代码从restapi获取访问令牌oauth2.0,问题是我已经通过Bash脚本(curl命令)成功地从服务器获取了它 Bash脚本(工作): #!/usr/bin/env bash # Base URL of TeamForge site. site_url="https://teamforge.example.com" # TeamForge authentication credentials. username="

我想通过Java代码从restapi获取访问令牌oauth2.0,问题是我已经通过Bash脚本(curl命令)成功地从服务器获取了它

Bash脚本(工作):

#!/usr/bin/env bash

       # Base URL of TeamForge site.
       site_url="https://teamforge.example.com"

       # TeamForge authentication credentials.
       username="foo"
       password="bar"

       # Requested scope (all)
       scope="urn:ctf:services:ctf

       curl -d "grant_type=password&client_id=api-client&scope=$scope&username=$username&password=$password" $site_url/sf/auth/token
有了这段代码片段,我得到了以下回应:

  {
         "access_token": "eyJraWQiOiIxIiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiJhZG1pbiIsImF1ZCI...",
         "token_type": "Bearer"
       }
当我尝试使用Unirest将其翻译成Java代码时:

  HttpResponse<JsonNode> jsonResponse = Unirest.post("\"https://teamforge.example.com/sf/auth/token")
                .header("accept", "application/json")
                .body("{\"grant_type\":\"password\"," +
                        "\"client_id\":\"api-client\", " +
                        "\"scope\":\"urn:ctf:services:ctf\"," +
                        "\"username\":\"foo\"," +
                        "\"password\":\"bar\"}")

                .asJson();

        System.out.println(jsonResponse.getBody());
经过几次研究和尝试,我仍然不知道我的Java代码请求中缺少了什么。有人能帮我添加缺少的东西或指引我正确的方向吗

CollabNet文档:

Saso

请尝试:

JsonNode jsonResponse = Unirest.post("https://teamforge.example.com/sf/auth/token")
.header("Content-Type", "application/json")
.field("scope", "urn:ctf:services:ctf")
.field("client_id", "api-client")
.field("grant_type", "password")
.field("username", "foo")
.field("password", "bar")
.asJson()
.getBody();
还有一个问题,你确定赠款类型吗?

grant\u type=client\u credentials
也许您需要类似的东西。

您的Java代码使用的是JSON主体,但bash脚本的参数直接位于post请求中,而不是JSON主体中。你试过用同样的方式调用它吗?@JPinzon01你的意思是用URL中的参数创建一个POST请求?示例:POST:www.myapi.com?grant_type=password&client_id=api client&scope=$scope&username=$username&password=$password不在URL中,而是在正文中。您可以尝试将用于bash脚本的字符串替换为JSON。问题是Oauth2服务器不需要JSON请求,而是需要在正文中包含HTTP参数的常规POST。响应是一个JSON对象,但请求的格式不必相同。感谢您的评论,但我按照您的建议尝试了,现在仍然可以使用。错误消息“{”错误描述“:”无效请求“,”错误“:”无效请求“}”
JsonNode jsonResponse = Unirest.post("https://teamforge.example.com/sf/auth/token")
.header("Content-Type", "application/json")
.field("scope", "urn:ctf:services:ctf")
.field("client_id", "api-client")
.field("grant_type", "password")
.field("username", "foo")
.field("password", "bar")
.asJson()
.getBody();