Библиотека запросов Python не работает, а cURL работает - PullRequest
1 голос
/ 22 марта 2019

Мне нужно получить JWT (JSON Web Token) из Microsoft API с помощью Python (отметьте эту документацию по API для Microsoft Graph)

Следующий код Python, использующий библиотеку requests, не работает с кодом ответа HTTP 400, однако эквивалентная команда cURL работает, возвращая ожидаемый JSON, содержащий JWT.

Python / requests код:

tenant = "<MY_FOO_TENANT>"
token_url = "https://login.microsoftonline.com/{}/oauth2/v2.0/token".format(tenant)
http_headers = {
    'Content-Type':  'application/x-www-form-urlencoded',
}
http_query_params = {
    "client_id": "<MY_FOO_C_ID>",
    "scope": "<MY_FOO_SCOPE>",
    "client_secret": "<MY_FOO_C_SECRET>",
    "grant_type": "client_credentials",
}
http_response = requests.post(token_url, params=http_query_params, headers=http_headers)

команда cURL:

curl -v -X POST \
  --data-urlencode 'client_id=<MY_FOO_C_ID>' \
  --data-urlencode 'scope=<MY_FOO_SCOPE>' \
  --data-urlencode 'client_secret=<MY_FOO_C_SECRET>' \
  --data-urlencode 'grant_type=client_credentials' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  'https://login.microsoftonline.com/<MY_FOO_TENANT>/oauth2/v2.0/token'

Из подробного вывода библиотеки requests я вижу, что это URL, кодирующий все эти параметры HTTP-запроса, поэтому я склонен думать, что это не должно быть проблемой.

  • что не так с реализацией Python?
  • как заставить это работать?

1 Ответ

2 голосов
/ 22 марта 2019

вы должны передать http_query_params как data вместо params. попробуйте следующий код:

tenant = "<MY_FOO_TENANT>"
token_url = "https://login.microsoftonline.com/{}/oauth2/v2.0/token".format(tenant)
http_headers = {
    'Content-Type':  'application/x-www-form-urlencoded',
}
http_body = {
    "client_id": "<MY_FOO_C_ID>",
    "scope": "<MY_FOO_SCOPE>",
    "client_secret": "<MY_FOO_C_SECRET>",
    "grant_type": "client_credentials",
}
http_response = requests.post(token_url, data=http_body, headers=http_headers)

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

...