Python запитує бібліотеку, як передавати заголовок авторизації з одним маркером


95

У мене є URI запиту та маркер. Якщо я використовую:

curl -s "<MY_URI>" -H "Authorization: TOK:<MY_TOKEN>"

тощо, я отримую 200 і переглядаю відповідні дані JSON. Отже, я встановив запити, і при спробі отримати доступ до цього ресурсу я отримую 403, мабуть, тому, що я не знаю правильний синтаксис для передачі цього маркера. Хтось може допомогти мені розібратися? Це те, що я маю:

import sys,socket
import requests

r = requests.get('<MY_URI>','<MY_TOKEN>')
r. status_code

Я вже пробував:

r = requests.get('<MY_URI>',auth=('<MY_TOKEN>'))
r = requests.get('<MY_URI>',auth=('TOK','<MY_TOKEN>'))
r = requests.get('<MY_URI>',headers=('Authorization: TOK:<MY_TOKEN>'))

Але нічого з цього не працює.

Відповіді:


112

У python:

('<MY_TOKEN>')

еквівалентно

'<MY_TOKEN>'

І просить інтерпретувати

('TOK', '<MY_TOKEN>')

Як ви хочете запити на використання базової автентифікації та створення заголовка авторизації, так:

'VE9LOjxNWV9UT0tFTj4K'

Яке є представлення base64 'TOK:<MY_TOKEN>'

Щоб передати власний заголовок, ви передаєте його у словник приблизно так:

r = requests.get('<MY_URI>', headers={'Authorization': 'TOK:<MY_TOKEN>'})

Відстеження (останній останній дзвінок): Файл "<stdin>", рядок 1, у <module> Файл "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/api .py ", рядок 55, у файлі запиту на повернення ('get', url, ** kwargs) Файл" /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/api .py ", рядок 44, у запиті повернення session.request (метод = метод, url = url, ** kwargs) Файл" /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages /requests/sessions.py ", рядок 323, у запиті prep = self.prepare_request (req)

@rebHelium ви можете GIST , що? Це далеко не весь стек, і немає вказівок на те, що ви насправді пробували.
Ian Stapleton Cordasco

На жаль, переповнення стека не дозволило мені опублікувати весь вивід. Я зробив саме так, як ви запропонували: r = request.get ('якою б не була моя URL-адреса', заголовки = {'Авторизація': 'TOK: якою б токен я не мав'})

Не потрібно вибачатися. Це спрацювало? Ви прийняли мою відповідь, але, схоже, це спричинило для вас виняток. Якщо ви створите суть, я можу допомогти вам з більшою легкістю, ніж вести тут розмову.
Ian Stapleton Cordasco

Сигма, я насправді пропустив одну дрібну деталь у коді, яка спричинила помилку. Фактичний код є конфіденційним, тому я не можу повідомити. Але я розміщу додаткові запитання, оскільки я хочу покращити свої навички Python, якщо ви хочете шукати. Це дуже прості запитання, я впевнений, ви б знали.

37

Я шукав щось подібне і натрапив на це . Це схоже на перший варіант, про який ви згадали

r = requests.get('<MY_URI>', auth=('<MY_TOKEN>'))

"auth" приймає два параметри: ім'я користувача та пароль, тому фактичний вираз повинен бути

r=requests.get('<MY_URI>', auth=('<YOUR_USERNAME>', '<YOUR_PASSWORD>'))

У моєму випадку пароля не було, тому я залишив другий параметр у полі auth пустим, як показано нижче:

r=requests.get('<MY_URI', auth=('MY_USERNAME', ''))

Сподіваюся, це комусь допомагає :)


3
якщо спробуєш r = requests.get('<MY_URI>',auth=('<MY_TOKEN>')), то отримаєш TypeError: 'str' object is not callable. це мене
тупило

Ваш anserd мені допоміг, але лише після прочитання посилання, яке ви надали, до якого ви потрапили. Робота з імпортом HTTPBasicAuth із request.auth робить це дуже простим!
Wallem89

26

Це спрацювало для мене:

access_token = #yourAccessTokenHere#

result = requests.post(url,
      headers={'Content-Type':'application/json',
               'Authorization': 'Bearer {}'.format(access_token)})

16

Ви також можете встановити заголовки для всього сеансу:

TOKEN = 'abcd0123'
HEADERS = {'Authorization': 'token {}'.format(TOKEN)}

with requests.Session() as s:

    s.headers.update(HEADERS)
    resp = s.get('http://example.com/')

4

Запити спочатку підтримують базову автентифікацію лише з параметрами переходу користувача, а не з маркерами.

Ви можете, якщо хочете, додати наступний клас, щоб мати запити, що підтримують базову аутентифікацію на основі маркера:

import requests
from base64 import b64encode

class BasicAuthToken(requests.auth.AuthBase):
    def __init__(self, token):
        self.token = token
    def __call__(self, r):
        authstr = 'Basic ' + b64encode(('token:' + self.token).encode('utf-8')).decode('utf-8')
        r.headers['Authorization'] = authstr
        return r

Потім, щоб використовувати його, запустіть такий запит:

r = requests.get(url, auth=BasicAuthToken(api_token))

Альтернативою було б натомість сформулювати власний заголовок, як пропонували інші користувачі тут.



2

Ви можете спробувати щось подібне

r = requests.get(ENDPOINT, params=params, headers={'Authorization': 'Basic %s' %  API_KEY})

1

Це спрацювало для мене:

r = requests.get('http://127.0.0.1:8000/api/ray/musics/', headers={'Authorization': 'Token 22ec0cc4207ebead1f51dea06ff149342082b190'})

Мій код використовує токен, створений користувачем.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.