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.
Advertisement
Answer
I was finally able to get it done by using the rauth library (pip install rauth
).
This is the code I used:
from rauth import OAuth2Service 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', # specific to my app 'grant_type': 'client_credentials', # generally required! } session = self.service.get_auth_session(data=data, decoder=json.loads) self.access_token = session.access_token