Запрос Python с аутентификацией (access_token)

Я пытаюсь получить запрос API в Python. Командная строка

curl --header "Authorization:access_token myToken" https://website.com/id

дает некоторый вывод JSON. myToken - шестнадцатеричная переменная, которая остается постоянной во всем. Я хотел бы сделать этот вызов из Python, чтобы я мог просматривать различные идентификаторы и анализировать вывод. Есть идеи? Прежде, чем требовалась аутентификация, я сделал это с помощью urllib2. Я также взглянул на модуль запросов, но не мог понять, как это сделать.

Большое спасибо.

9 ответов

Решение

Пакет запросов имеет очень хороший API для HTTP-запросов, добавление настраиваемого заголовка работает следующим образом ( источник: официальные документы):

>>> import requests
>>> response = requests.get(
... 'https://website.com/id', headers={'Authorization': 'access_token myToken'})

Если вы не хотите использовать внешнюю зависимость, то же самое с использованием urllib2 из стандартной библиотеки выглядит следующим образом ( источник: отсутствующее руководство):

>>> import urllib2
>>> response = urllib2.urlopen(
... urllib2.Request('https://website.com/id', headers={'Authorization': 'access_token myToken'})

У меня была такая же проблема при попытке использовать токен с Github.

Единственный синтаксис, который работал для меня с Python 3:

import requests

myToken = '<token>'
myUrl = '<website>'
head = {'Authorization': 'token {}'.format(myToken)}
response = requests.get(myUrl, headers=head)
>>> import requests
>>> response = requests.get('https://website.com/id', headers={'Authorization': 'access_token myToken'})

Если вышеуказанное не работает, попробуйте следующее:

>>> import requests
>>> response = requests.get('https://api.buildkite.com/v2/organizations/orgName/pipelines/pipelineName/builds/1230', headers={ 'Authorization': 'Bearer <your_token>' })
>>> print response.json()
      import requests

BASE_URL = 'http://localhost:8080/v3/getPlan'
token = "eyJhbGciOiJSUzI1NiIsImtpZCI6ImR"

headers = {'Authorization': "Bearer {}".format(token)}
auth_response = requests.get(BASE_URL, headers=headers)

print(auth_response.json())

Выход :

      {
"plans": [
    {
        "field": false,
        "description": "plan 12",
        "enabled": true
    }
  ]
}

Уже много хороших ответов, но я еще не видел эту опцию:

Если вы используете requests, вы также можете указать пользовательский класс проверки подлинности , аналогичный HTTPBasicAuth. Например:

      from requests.auth import AuthBase


class TokenAuth(AuthBase):
    def __init__(self, token, auth_scheme='Bearer'):
        self.token = token
        self.auth_scheme = auth_scheme

    def __call__(self, request):
        request.headers['Authorization'] = f'{self.auth_scheme} {self.token}'
        return request

Это можно использовать следующим образом (используя пользовательскую схему auth_scheme из примера):

      response = requests.get(
    url='https://example.com', 
    auth=TokenAuth(token='abcde', auth_scheme='access_token'),
)

Это может показаться более сложным способом установки Request.headersатрибут, но это может быть полезно, если вы хотите поддерживать несколько типов аутентификации. Обратите внимание, что это позволяет нам использовать authаргумент вместо headersаргумент.

Вы пробовали uncurlпакет (https://github.com/spulec/uncurl)? Вы можете установить его через pip,pip install uncurl. Ваш запрос curl возвращается:

>>> uncurl "curl --header \"Authorization:access_token myToken\" https://website.com/id"

requests.get("https://website.com/id",
    headers={
        "Authorization": "access_token myToken"
    },
    cookies={},
)

Один из вариантов, используемых в python для получения ниже:

      import requests

token="abcd" < retrieved based>
headers = {'Authorization': "Bearer {}".format(token)}
response = requests.get(
    'https://<url api>',
    headers=headers,
    verify="root ca certificate"
)

print(response.content)

Если вы получаете сообщение об ошибке несоответствия имени хоста, необходимо настроить дополнительные сети SAN на сервере с именами хостов.

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

Я добавлю небольшую подсказку: кажется, что то, что вы передаете в качестве ключевого значения заголовка, зависит от вашего типа авторизации, в моем случае это было PRIVATE-TOKEN

header = {'PRIVATE-TOKEN': 'my_token'}
response = requests.get(myUrl, headers=header)
      import requests 

r = requests.get(<website>, header={ 'Authorization' : 'token <key>' })
Другие вопросы по тегам