Я хочу получить токен доступа 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:
Сасо
@ JPinzon01 Вы имеете в виду создание POST-запроса с параметрами в URL? Пример: POST: www.myapi.com?grant_type=password&client_id=api-client&scope = $ scope & username = $ us ername & password = $ pas sword
Не в URL, а в теле. Вы можете попробовать поместить ту же строку, которую вы используете для сценария bash, вместо JSON. Дело в том, что сервер Oauth2 не ожидает запроса JSON, ожидает обычного POST с параметрами HTTP в теле. Ответ представляет собой объект JSON, но запрос не обязательно должен быть в том же формате.
Спасибо за комментарий, но я попробовал, как вы предложили, и теперь он все еще работает. Сообщение об ошибке "{" error_description ":" Invalid request "," error ":" invalid_request "}"




Пожалуйста, попробуй:
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 может нужно что то подобное.
Ваш код Java использует тело JSON, но сценарий bash имеет параметры непосредственно в почтовом запросе, а не в теле JSON. Вы пробовали называть это так же?