Преобразование Curl Oauth2 в Python Script - PullRequest
0 голосов
/ 26 февраля 2020

Ниже bash скрипт работает и возвращает токен.

curl -X POST --user <id>:<key> 'https://<name>.auth.eu-west-1.amazoncognito.com/oauth2/token?grant_type=client_credentials' -H 'Content-Type: application/x-www-form-urlencoded'

Теперь я хотел бы сгенерировать токен с помощью скрипта Python. В настоящее время я борюсь с использованием библиотеки запросов, но безуспешно. Ниже генерируется Ответ 400 (неверный запрос).

import requests
parameters = {"user":"<id>:<key>", "Content-Type": "application/x-www-form-urlencoded"}
response = requests.get("https://<name>.auth.eu-west-1.amazoncognito.com/oauth2/token?grant_type=client_credentials", params=parameters)
print(response)

1 Ответ

0 голосов
/ 28 февраля 2020

Чтобы исправить использование requests:

  • Используйте post() вместо get().
  • Используйте объект auth для создания основы c Auth header. (Или отправьте учетные данные в теле)
  • Удалите заголовок типа содержимого; requests установит это для вас.
  • Извлекает grant_type из строки запроса. Это относится к телу запроса.

Хотя в документации для конечной точки /oauth2/token говорится, что вам нужно отправить базовый c auth заголовок для client_credentials гранта, он также работает, если Вы отправляете идентификатор клиента и секрет в теле запроса (без заголовка авторизации).

Таким образом, эти python примеры работают и по существу эквивалентны:

Учетные данные в теле запроса :

import requests

url = 'https://<COGNITO_DOMAIN>.auth.<REGION>.amazoncognito.com/oauth2/token'
params = {
    "client_secret": "1ixxxxxxxxxxxxxxxxc2b",
    "grant_type": "client_credentials",
    "client_id": "7xxxxxxxxxxxxxxxt"
}
response = requests.post(url, data=params)

print(response)
print(response.text)

Учетные данные в базе c auth header:

import requests

url = 'https://<COGNITO_DOMAIN>.auth.<REGION>.amazoncognito.com/oauth2/token'
params = {
    "grant_type": "client_credentials"
}
auth = ('7xxxxxxxxxxt', '1ixxxxxxxxxxxxxxxc2b')
r = requests.post(url, data=params, auth=auth)

print(r)
print(r.text)
...