Python - базовая авторизация (OAuth2.0) для получения токена доступа из API - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь сгенерировать токен доступа из API, используя следующую необходимую информацию:

Конечная точка авторизации: https://api.paylocity.com/IdentityServer/connect/token

Заголовок авторизации Ожидается, что запрос будет выполнен в форме запроса базовой аутентификации с заголовком «Авторизация», содержащим идентификатор клиента и секрет клиента. Это означает, что стандартный пользователь в кодировке base-64: пароль с префиксом «Basic» в качестве значения для заголовка авторизации, где user - идентификатор клиента, а пароль - client-secret.

Заголовок типа контента Заголовок «Content-Type» должен быть «application / x-www-form-urlencoded».

Другие значения Запрос должен опубликовать следующие закодированные значения формы в теле запроса:

grant_type = client_credentials scope = WebLinkAPI

Я безуспешно пытался использовать пакет «запросов» Python, см. Ниже:

import requests

url = "https://api.paylocity.com/IdentityServer/connect/token"

headers = {
    'Authorization': "Basic **********:**********",
    'Content-Type': "application/x-www-form/urlencoded"
    }

body = {
    'grant_type': "client_credentials",
    'scope': 'WebLinkAPI'
}

response = requests.request("POST", url, headers=headers, params=body)

print(response.text)

Вместо токена доступа я получаю сообщение об ошибке:

{ "ошибка": "invalid_client"}

Я проверил, что мои имя пользователя и пароль в кодировке base64 верны, он выглядит примерно так: «G / RaNdOm: MoReRaNdOm ==», и когда я добавляю их в почтальон, он работает, поэтому мои учетные данные верны. Что может быть не так?

1 Ответ

0 голосов
/ 04 июля 2019

Я решил это. Было две проблемы: заголовок авторизации не использовал ASCII в качестве целевой кодировки с кодировкой base64. Другая проблема заключалась в попытке добавить дополнительные значения к параметрам вместо тела в пакете запросов. Решением было заменить «params» на «data». Здесь было решение:

url = "https://api.paylocity.com/IdentityServer/connect/token"

body = "grant_type=client_credentials&scope=WebLinkAPI"
headers = {
    'Content-Type': "application/x-www-form-urlencoded",
    'Authorization': "Basic ***(base64ASCII)username:password***",
    }

response = requests.request("POST", url, data=body, headers=headers)

print(response.text)
...