Making an API call in Python with an API that requires a bearer token
Matthew Barrera
Looking for some help with integrating a JSON API call into a Python program.
I am looking to integrate the following API into a Python .py program to allow it to be called and the response to be printed.
The API guidance states that a bearer token must be generated to allow calls to the API, which I have done successfully. However I am unsure of the syntax to include this token as bearer token authentication in Python API request.
I can successfully complete the above request using cURL with a token included. I have tried "urllib" and "requests" routes but to no avail.
Full API details: IBM X-Force Exchange API Documentation - IP Reputation
5 Answers
It just means it expects that as a key in your header data
import requests
endpoint = ".../api/ip"
data = {"ip": "1.1.2.3"}
headers = {"Authorization": "Bearer MYREALLYLONGTOKENIGOT"}
print(requests.post(endpoint, data=data, headers=headers).json()) 8 If you are using requests module, an alternative option is to write an auth class, as discussed in "New Forms of Authentication":
import requests
class BearerAuth(requests.auth.AuthBase): def __init__(self, token): self.token = token def __call__(self, r): r.headers["authorization"] = "Bearer " + self.token return rand then can you send requests like this
response = requests.get(' auth=BearerAuth('3pVzwec1Gs1m'))which allows you to use the same auth argument just like basic auth, and may help you in certain situations.
The token has to be placed in an Authorization header according to the following format:
Authorization: Bearer [Token_Value]
Code below:
import urllib2
import json
def get_auth_token(): """ get an auth token """ req=urllib2.Request("") response=urllib2.urlopen(req) html=response.read() json_obj=json.loads(html) token_string=json_obj["token"].encode("ascii","ignore") return token_string
def get_response_json_object(url, auth_token): """ returns json object with info """ auth_token=get_auth_token() req=urllib2.Request(url, None, {"Authorization": "Bearer %s" %auth_token}) response=urllib2.urlopen(req) html=response.read() json_obj=json.loads(html) return json_obj 1 Here is full example of implementation in cURL and in Python - for authorization and for making API calls
cURL
1. Authorization
You have received access data like this:
Username: johndoe
Password: zznAQOoWyj8uuAgq
Consumer Key: ggczWttBWlTjXCEtk3Yie_WJGEIa
Consumer Secret: uuzPjjJykiuuLfHkfgSdXLV98CigaWhich you can call in cURL like this:
curl -k -d "grant_type=password&username=Username&password=Password" \ -H "Authorization: Basic Base64(consumer-key:consumer-secret)" \ or for this case it would be:
curl -k -d "grant_type=password&username=johndoe&password=zznAQOoWyj8uuAgq" \ -H "Authorization: Basic zzRjettzNUJXbFRqWENuuGszWWllX1iiR0VJYTpRelBLZkp5a2l2V0xmSGtmZ1NkWExWzzhDaWdh" \ Answer would be something like:
{ "access_token": "zz8d62zz-56zz-34zz-9zzf-azze1b8057f8", "refresh_token": "zzazz4c3-zz2e-zz25-zz97-ezz6e219cbf6", "scope": "default", "token_type": "Bearer", "expires_in": 3600
}2. Calling API
Here is how you call some API that uses authentication from above. Limit and offset are just examples of 2 parameters that API could implement.
You need access_token from above inserted after "Bearer ".So here is how you call some API with authentication data from above:
curl -k -X GET "" -H "accept: application/json" -H "Authorization: Bearer zz8d62zz-56zz-34zz-9zzf-azze1b8057f8"Python
Same thing from above implemented in Python. I've put text in comments so code could be copy-pasted.
# Authorization data
import base64
import requests
username = 'johndoe'
password= 'zznAQOoWyj8uuAgq'
consumer_key = 'ggczWttBWlTjXCEtk3Yie_WJGEIa'
consumer_secret = 'uuzPjjJykiuuLfHkfgSdXLV98Ciga'
consumer_key_secret = consumer_key+":"+consumer_secret
consumer_key_secret_enc = base64.b64encode(consumer_key_secret.encode()).decode()
# Your decoded key will be something like:
#zzRjettzNUJXbFRqWENuuGszWWllX1iiR0VJYTpRelBLZkp5a2l2V0xmSGtmZ1NkWExWzzhDaWdh
headersAuth = { 'Authorization': 'Basic '+ str(consumer_key_secret_enc),
}
data = { 'grant_type': 'password', 'username': username, 'password': password
}
## Authentication request
response = requests.post(' headers=headersAuth, data=data, verify=True)
j = response.json()
# When you print that response you will get dictionary like this: { "access_token": "zz8d62zz-56zz-34zz-9zzf-azze1b8057f8", "refresh_token": "zzazz4c3-zz2e-zz25-zz97-ezz6e219cbf6", "scope": "default", "token_type": "Bearer", "expires_in": 3600 }
# You have to use `access_token` in API calls explained bellow.
# You can get `access_token` with j['access_token'].
# Using authentication to make API calls
## Define header for making API calls that will hold authentication data
headersAPI = { 'accept': 'application/json', 'Authorization': 'Bearer '+j['access_token'],
}
### Usage of parameters defined in your API
params = ( ('offset', '0'), ('limit', '20'),
)
# Making sample API call with authentication and API parameters data
response = requests.get(' headers=headersAPI, params=params, verify=True)
api_response = response.json() 1 import json
import os
import requests
def lambda_handler(event, context): print(event) item = list(map(lambda x: x['detail']['item'], event['inputData'])) print("item List :", item) consumer_key = os.getenv('consumer_key') consumer_secret = os.getenv('consumer_secret') entitlement_url=os.getenv('entitlement_url') storage_url=os.getenv('storage_url') access_token = get_jwt_token(consumer_key,consumer_secret,entitlement_url) print("Response from entitlement: ", access_token) for listID in list: print("listID: ", listID) response = get_storage_service(access_token,storage_url,listID) print("Response from storage: ", response.text) return "Success"
def get_jwt_token(consumer_key, consumer_secret, url): data = 'grant_type=client_credentials&client_id=' + consumer_key + '&client_secret=' + consumer_secret header = {"Content-type": "application/x-www-form-urlencoded"} try: response = requests.post(url, data=data, headers=header) access_token = json.loads(response.text) final_response=access_token['access_token'] except requests.exceptions as err: print(err) final_response = 'error' return final_response
def get_storage_service(jwt_token, url, list_id): final_url = url + list_id + "/data" print("Final url is :", final_url) headers_api = { 'Authorization': 'Bearer ' + jwt_token } try: response = requests.get(url=final_url, headers=headers_api) except requests.exceptions as err: print(err) response = 'error' return responseusing enviornment variable