web-dev-qa-db-fra.com

Comment puis-je obtenir un oauth2 access_token en Python

Pour un projet, quelqu'un m'a donné les données que j'ai utilisées dans Postman à des fins de test:

Dans Postman cela fonctionne parfaitement.

URL d'authentification: https://api.example.com/oauth/access_token
URL du jeton d'accès: https://api.example.com/access_token
ID client: abcde
secret client: 12345
Nom du jeton: access_token
Type de subvention: Informations d'identification du client 

Tout ce dont j'ai besoin est de récupérer le jeton d'accès. 

Une fois, j'ai reçu le jeton d'accès, je peux continuer. 

J'ai déjà essayé plusieurs packages Python et du code personnalisé, mais cette tâche apparemment simple commence à créer un véritable casse-tête. 

Un exemple que j'ai essayé:

import httplib
import base64
import urllib
import json

def getAuthToken():
    CLIENT_ID = "abcde"
    CLIENT_SECRET = "12345"
    TOKEN_URL = "https://api.example.com/oauth/access_token"

    conn = httplib.HTTPSConnection("api.example.com")

    url = "/oauth/access_token"

    params = {
        "grant_type": "client_credentials"
    }

    client = CLIENT_ID
    client_secret = CLIENT_SECRET

    authString = base64.encodestring('%s:%s' % (client, client_secret)).replace('\n', '')

    requestUrl = url + "?" + urllib.urlencode(params)

    headersMap = {
        "Content-Type": "application/x-www-form-urlencoded",
        "Authorization": "Basic " + authString
    }

    conn.request("POST", requestUrl, headers=headersMap)

    response = conn.getresponse()

    if response.status == 200:
        data = response.read()
        result = json.loads(data)

        return result["access_token"]

Ensuite, j'ai celui-ci:

import requests
import requests.auth

CLIENT_ID = "abcde"
CLIENT_SECRET = "12345"
TOKEN_URL = "https://api.example.com/oauth/access_token"
REDIRECT_URI = "https://www.getpostman.com/oauth2/callback"

def get_token(code):
    client_auth = requests.auth.HTTPBasicAuth(CLIENT_ID, CLIENT_SECRET)
    post_data = {"grant_type": "client_credentials",
                 "code": code,
                 "redirect_uri": REDIRECT_URI}
    response = requests.post(TOKEN_URL,
                             auth=client_auth,
                             data=post_data)
    token_json = response.json()
    return token_json["access_token"]

Si cela fonctionne, que devrais-je mettre dans le paramètre code

J'espère vraiment que quelqu'un pourra m'aider ici. 

Merci d'avance.

7
Johan Vergeer

J'ai finalement pu le faire

C'est le code que j'ai utilisé:

class ExampleOAuth2Client:
    def __init__(self, client_id, client_secret):
        self.access_token = None

        self.service = OAuth2Service(
            name="foo",
            client_id=client_id,
            client_secret=client_secret,
            access_token_url="http://api.example.com/oauth/access_token",
            authorize_url="http://api.example.com/oauth/access_token",
            base_url="http://api.example.com/",
        )

        self.get_access_token()

    def get_access_token(self):
        data = {'code': 'bar',
                'grant_type': 'client_credentials',
                'redirect_uri': 'http://example.com/'}

        session = self.service.get_auth_session(data=data, decoder=json.loads)

        self.access_token = session.access_token
7
Johan Vergeer

Simplement (en cas d'authentification Facebook):

import requests, json

access_token = requests.get("https://graph.facebook.com/oauth/access_token?grant_type=client_credentials&client_id=your_client_id&client_secret=your_client_secret").json()["access_token"]

Ou vous pouvez utiliser bibliothèque rauth .

Dans le docs il y a un exemple intéressant avec l'authentification facebook oAuth2:

from rauth import OAuth2Service

facebook = OAuth2Service(
client_id='your_client_id',
client_secret='your_client_secret',
name='facebook',
authorize_url='https://graph.facebook.com/oauth/authorize',
access_token_url='https://graph.facebook.com/oauth/access_token',
base_url='https://graph.facebook.com/')

et après l'ouverture d'une session:

session = facebook.get_auth_session(data={'code': 'foo','redirect_uri': redirect_uri})

dans la session json il y a votre jeton d'accès

2
CarloV