122 votes

demande python avec authentification (access_token)

J'essaie d'obtenir une requête d'API en python. La ligne de commande

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

donne une sortie json. myToken est une variable hexadécimale qui reste constante tout au long du processus. Je voudrais faire cet appel à partir de python afin de pouvoir boucler sur les différents identifiants et analyser la sortie. Des idées ? Avant que l'authentification ne soit nécessaire, je l'ai fait avec urllib2 . J'ai également jeté un coup d'œil à la requests mais je n'ai pas réussi à trouver comment le faire.

Merci beaucoup.

190voto

wosc Points 1829

Le site demande dispose d'une très belle API pour les requêtes HTTP, l'ajout d'un en-tête personnalisé fonctionne comme suit ( source : docs officiels ):

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

Si vous ne voulez pas utiliser une dépendance externe, la même chose en utilisant urllib2 de la bibliothèque standard ressemble à ceci ( source : le manuel manquant ):

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

45voto

bloodrootfc Points 314

J'ai eu le même problème en essayant d'utiliser un jeton avec Github.

La seule syntaxe qui a fonctionné pour moi avec Python 3 est :

import requests

myToken = '<token>'
myUrl = '<website>'
head = {'Authorization': 'token {}'.format(myToken)}
response = requests.get(myUrl, headers=head)

26voto

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

Si ce qui précède ne fonctionne pas, essayez ceci :

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

12voto

Shivam Bharadwaj Points 353
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())

Sortie :

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

12voto

Dennis Points 600

Beaucoup de bonnes réponses déjà, mais je n'ai pas encore vu cette option :

Si vous utilisez requests vous pouvez également spécifier un authentification personnalisée similaire à la classe HTTPBasicAuth . Par exemple :

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

On peut l'utiliser comme suit (en utilisant la fonction personnalisée auth_scheme de l'exemple) :

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

Cela peut sembler être une façon plus compliquée de définir l'option Request.headers mais il peut être avantageux si vous souhaitez prendre en charge plusieurs types d'authentification. Notez que cela nous permet d'utiliser l'attribut auth au lieu de l'argument headers argument.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X