Ошибка вызова однократного пароля для входа в API CF - PullRequest
1 голос
/ 24 января 2020

Я работаю с сервисами CF API RESTful. Пытаясь получить токен доступа из облака, основанного * API UAA dry с помощью веб-метода https://login..../oauth/token.

Я проверил правильность заголовков и содержимого тела, но вызвал API всегда возвращает код ошибки 400 с сообщением об отсутствии типа предоставления.

Я реализовал этот вызов в Objective- C, Swift & now Python. Все тесты возвращают один и тот же результат. Вот мой пример кода в Python:

import json
import requests
import urllib

params = {"grant_type": "password",
          "passcode": "xxx"
          }
url = "https://login.system.aws-usw02-pr.ice.predix.io/oauth/token"
headers = {"Authorization": "Basic Y2Y6", "Content-Type": "application/json", "Accept": "application/x-www-form-urlencoded"}

encodeParams = urllib.parse.urlencode(params)
response = requests.post(url, headers=headers, data=encodeParams)
rjson = response.json()
print(rjson)

Каждый раз, когда я запускаю это, я получаю неверный запрос об ошибке ответа, Отсутствует тип предоставления

Любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 25 января 2020

Ваш код в основном работал для меня, хотя я использовал другой сервер UAA.

Мне пришлось сделать только одно изменение. Вы перевернули заголовки Accept и Content-Type. Accept должно быть application/json, потому что это формат, который вы хотите вернуть, и Content-Type должно быть application/x-www-form-urlencoded, потому что это формат, который вы отправляете.

См. API Docs для справки .

import json
import requests
import urllib
import getpass

UAA_SERVER = "https://login.run.pivotal.io"

print("go to {}/passcode".format(UAA_SERVER))

params = {
    "grant_type": "password",
    "passcode": getpass.getpass(),
}

url = "https://login.run.pivotal.io/oauth/token"
headers = {
    "Authorization": "Basic Y2Y6",
    "Content-Type": "application/x-www-form-urlencoded",
    "Accept": "application/json"
}

encodeParams = urllib.parse.urlencode(params)
response = requests.post(url, headers=headers, data=encodeParams)
rjson = response.json()
print(json.dumps(rjson, indent=4, sort_keys=True))

Я внес несколько других незначительных изменений, но они должны повлиять на функциональность.

  1. Используйте getpass.getpass() для загрузки пароля.
  2. Задайте целевой сервер в качестве переменной.
  3. Довольно напечатайте ответ JSON.

Единственное, что следует отметить, это то, что клиенту OAuth2, который вы используете, должно быть разрешено использовать тип предоставления пароля. Похоже, что вы используете тот же клиент, который использует cf cli, поэтому, если ваш сервер UAA является частью стандартной установки Cloud Foun dry, это, вероятно, верно, но если он все еще не работает для вас, то Возможно, вам придется поговорить с администратором и убедиться, что клиент настроен на это.

Надеюсь, это поможет!

...