How can I get an oauth2 access_token using Python

71,795

Solution 1

I was finally able to get it done

This is the code I used:

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

Solution 2

Before using it, you need to pip install requests

import requests


def get_access_token(url, client_id, client_secret):
    response = requests.post(
        url,
        data={"grant_type": "client_credentials"},
        auth=(client_id, client_secret),
    )
    return response.json()["access_token"]


get_access_token("https://api.example.com/access_token", "abcde", "12345")

Solution 3

Simply (in case of Facebook Authentication):

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"]

Or you can use rauth library.

In the docs there is an interesting example with facebook oAuth2 authentication:

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

and after open a session:

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

in the session json there is your access token

Share:
71,795
Johan Vergeer
Author by

Johan Vergeer

Updated on October 13, 2021

Comments

  • Johan Vergeer
    Johan Vergeer over 2 years

    For a project someone gave me this data that I have used in Postman for testing purposes:

    In Postman this works perfectly.

    Auth URL: https://api.example.com/oauth/access_token
    Access Token URL: https://api.example.com/access_token
    client ID: abcde
    client secret: 12345
    Token name: access_token
    Grant type: Client Credentials

    All I need is to get back the access token.

    Once, I got the access token I can continue.

    I have already tried several Python packages and some custom code, but somehow this seemingly simple task starts to create a real headache.

    One exemple I tried:

    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"]
    

    Then I have got this one:

    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"]
    

    If this would work, what should I put into the code parameter

    I really hope someone can help me out here.

    Thanks in advance.

  • Rhyuk
    Rhyuk over 7 years
    Can you please explain your code a little bit? I can't seem to get it to work. Thanks in advance!
  • user1655072
    user1655072 over 5 years
    can someone explain what is the 'bar' under 'code'? Some random string? some kind of url?
  • Jamieson Rhyne
    Jamieson Rhyne almost 5 years
    Is this using the rauth library?
  • DUDANF
    DUDANF almost 5 years
    Could you please explain your code/provide a complete answer? What library have you used? What is "bar"?
  • liang
    liang almost 4 years
    last commit for rauth library is in 2015, is this library still maintained?
  • EnE_
    EnE_ almost 4 years
    I would say no. Try 'oauthlib' which seems popular enough and had a commit 9 days ago (07-Aug-2020)