Проблемы с аутентификацией Rest API с использованием OAuth2 с использованием Python

#python #api #authentication #curl

#python #API #аутентификация #curl

Вопрос:

Я пытаюсь использовать Rest Api, который имеет аутентификацию OAuth2, используя сгенерированный apikey в консоли администратора портала для получения токена доступа, который затем будет использоваться для всех запросов. В документации они предоставляют пример запроса для получения токена доступа с помощью curl, который выглядит следующим образом:

 curl --request POST 
  --url https://exampleurl.com/oauth2/token 
  -u apitoken:abcsdsadssfsagasagasgasgasgasg 
  --data grant_type=client_credentials
  

Использование этого скрипта работает, и я получаю токен доступа в качестве ответа.
Сейчас я работаю на python и пока не могу получить там те же результаты. Код, который я писал, выглядит следующим образом:

 import requests 
headers={'apitoken': 'abcsdsadssfsagasagasgasgasgasg'}
data={'grant_type': 'client_credentials'}
try:
    r = requests.post('https://exampleurl.com/oauth2/token', headers=headers, data=data)
    r.raise_for_status()
except requests.exceptions.HTTPError as err:
    raise SystemExit(err)
  

Запуск этого скрипта выдает мне ошибку HTTP 401 «Несанкционированный доступ к URL».
Любая помощь приветствуется.

Ответ №1:

Используя -u опцию curl команды, вы устанавливаете заголовок 'Authorization: Basic your_credentials' , где your_credentials part — это версия строки в кодировке base64 apitoken:abcsdsadssfsagasagasgasgasgasg . Итак, в Python вы можете либо установить заголовок авторизации как:

 import base64
your_credentials = "{}:{}".format('apitoken', 'abcsdsadssfsagasagasgasgasgasg')
your_credentials_base64 = base64.b64encode(your_credentials.encode())
headers={'Authorization': 'Basic {}'.format(your_credentials_base64)}
data={'grant_type': 'client_credentials'}
try:
    r = requests.post('https://exampleurl.com/oauth2/token', headers=headers, data=data)
    r.raise_for_status()
except requests.exceptions.HTTPError as err:
    raise SystemExit(err)
  

или вы можете использовать requests.auth

 import requests
from requests.auth import HTTPBasicAuth
data={'grant_type': 'client_credentials'}
try:
    r = requests.post('https://exampleurl.com/oauth2/token', data=data, auth=HTTPBasicAuth('apitoken', 'abcsdsadssfsagasagasgasgasgasg'))
    r.raise_for_status()
except requests.exceptions.HTTPError as err:
    raise SystemExit(err)