Подтвердить что ты не робот

Python запрашивает библиотеку, как передать заголовок авторизации с одним токеном

У меня есть 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>'))

Но никто из них не работает.

4b9b3361

Ответ 1

В python:

('<MY_TOKEN>')

эквивалентно

'<MY_TOKEN>'

И запросы интерпретируются

('TOK', '<MY_TOKEN>')

Как вы хотите, чтобы запросы использовали Basic Authentication и создавали заголовок авторизации следующим образом:

'VE9LOjxNWV9UT0tFTj4K'

Каково представление base64 'TOK:<MY_TOKEN>'

Чтобы передать свой собственный заголовок, вы переходите в словарь следующим образом:

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

Ответ 2

Я искал что-то подобное и сталкивался с этим. Похоже, в первом варианте вы упомянули

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

Это сработало для меня:

access_token = #yourAccessTokenHere#

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

Ответ 4

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

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

with requests.Session() as s:

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

Ответ 5

Вы можете попробовать что-то вроде этого

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

Ответ 6

Это будет работать для вас в Python;

# Call JIRA API with HTTPBasicAuth
import json
import requests
from requests.auth import HTTPBasicAuth

JIRA_EMAIL = "****"
JIRA_TOKEN = "****"
BASE_URL = "https://****.atlassian.net"
API_URL = "/rest/api/3/serverInfo"

API_URL = BASE_URL+API_URL

BASIC_AUTH = HTTPBasicAuth(JIRA_EMAIL, JIRA_TOKEN)
HEADERS = {'Content-Type' : 'application/json;charset=iso-8859-1'}

response = requests.get(
    API_URL,
    headers=HEADERS,
    auth=BASIC_AUTH
)

print(json.dumps(json.loads(response.text), sort_keys=True, indent=4, separators=(",", ": ")))

Ответ 7

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

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

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))

Вместо этого можно было бы сформулировать собственный заголовок, как это было предложено другими пользователями здесь.