web-dev-qa-db-fra.com

Python demande à la bibliothèque comment passer en-tête d'autorisation avec un seul jeton

J'ai un URI de requête et un jeton. Si j'utilise:

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

etc., j’obtiens un 200 et j’affiche les données JSON correspondantes . Alors, j’ai installé les requêtes et lorsque j’essaie d’accéder à cette ressource j’obtiens un 403 probablement parce que je ne connais pas la syntaxe correcte pour transmettre ce jeton. Quelqu'un peut-il m'aider à comprendre? Voici ce que j'ai:

import sys,socket
import requests

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

J'ai déjà essayé:

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

Mais aucun de ces travaux.

47
user1552586

En python:

('<MY_TOKEN>')

est équivalent à

'<MY_TOKEN>'

Et demande interprète

('TOK', '<MY_TOKEN>')

Lorsque vous souhaitez que les demandes utilisent l'authentification de base et construisent un en-tête d'autorisation, procédez comme suit:

'VE9LOjxNWV9UT0tFTj4K'

Quelle est la représentation en base64 de 'TOK:<MY_TOKEN>'

Pour passer votre propre en-tête, vous passez dans un dictionnaire comme ceci:

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

Je cherchais quelque chose de similaire et suis tombé sur ça . Cela ressemble à la première option que vous avez mentionnée

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

"auth" prend deux paramètres: nom d'utilisateur et mot de passe, ainsi la déclaration devrait être

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

Dans mon cas, il n'y avait pas de mot de passe, j'ai donc laissé le second paramètre du champ auth vide comme indiqué ci-dessous:

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

J'espère que ça aide quelqu'un :)

21
BajajG

Cela a fonctionné pour moi:

access_token = #yourAccessTokenHere#

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

Vous pouvez également définir des en-têtes pour toute la session:

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

with requests.Session() as s:

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

Vous pouvez essayer quelque chose comme ça

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

Les demandes supportent nativement l'authentification de base uniquement avec les paramètres pass-user, pas avec les jetons.

Si vous le souhaitez, vous pouvez ajouter la classe suivante pour que les demandes prennent en charge l'authentification de base basée sur un jeton:

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

Ensuite, pour l'utiliser, lancez la requête suivante:

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

Une alternative serait de formuler un en-tête personnalisé à la place, comme suggéré par d'autres utilisateurs ici.

0
Amit Blum