Java OAuth 2.0 получить токен доступа

Я хочу получить токен доступа OAuth 2.0 из REST API через код Ява, дело в том, что мне удалось успешно вернуть его с сервера с помощью скрипта Баш (команда 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:

  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());

Ответ был:

{"error_description":"Invalid grant","error":"invalid_grant"}

После нескольких исследований и попыток я все еще не знаю, что мне не хватает в моем запросе кода Java. Может ли кто-нибудь помочь мне добавить недостающие вещи или направить меня в правильном направлении?

Документы CollabNet:

Сасо

Ваш код Java использует тело JSON, но сценарий bash имеет параметры непосредственно в почтовом запросе, а не в теле JSON. Вы пробовали называть это так же?

JPinzon01 23.11.2018 16:55

@ JPinzon01 Вы имеете в виду создание POST-запроса с параметрами в URL? Пример: POST: www.myapi.com?grant_type=password&client_id=api-client&scope‌ = $ scope & username = $ us‌ ername & password = $ pas‌ sword

Sašo Pavlič 28.11.2018 20:28

Не в URL, а в теле. Вы можете попробовать поместить ту же строку, которую вы используете для сценария bash, вместо JSON. Дело в том, что сервер Oauth2 не ожидает запроса JSON, ожидает обычного POST с параметрами HTTP в теле. Ответ представляет собой объект JSON, но запрос не обязательно должен быть в том же формате.

JPinzon01 29.11.2018 22:06

Спасибо за комментарий, но я попробовал, как вы предложили, и теперь он все еще работает. Сообщение об ошибке "{" error_description ":" Invalid request "," error ":" invalid_request "}"

Sašo Pavlič 05.12.2018 09:50
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
11 627
1

Ответы 1

Пожалуйста, попробуй:

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_type = client_credentials может нужно что то подобное.

Другие вопросы по теме