Authenticate and Query Microsoft Graph using MSAL and Python. Associated blogpost https://blog.darrenjrobinson.com/microsoft-graph-using-msal-with-python/
import msal | |
import jwt | |
import json | |
import requests | |
import pandas as pd | |
from datetime import datetime | |
accessToken = None | |
requestHeaders = None | |
tokenExpiry = None | |
queryResults = None | |
graphURI = 'https://graph.microsoft.com' | |
def msgraph_auth(): | |
global accessToken | |
global requestHeaders | |
global tokenExpiry | |
tenantID = 'yourTenantID' | |
authority = 'https://login.microsoftonline.com/' + tenantID | |
clientID = 'yourAADRegisteredAppClientID' | |
clientSecret = 'yourAADRegisteredAppClientSecret' | |
scope = ['https://graph.microsoft.com/.default'] | |
app = msal.ConfidentialClientApplication(clientID, authority=authority, client_credential = clientSecret) | |
try: | |
accessToken = app.acquire_token_silent(scope, account=None) | |
if not accessToken: | |
try: | |
accessToken = app.acquire_token_for_client(scopes=scope) | |
if accessToken['access_token']: | |
print('New access token retreived....') | |
requestHeaders = {'Authorization': 'Bearer ' + accessToken['access_token']} | |
else: | |
print('Error aquiring authorization token. Check your tenantID, clientID and clientSecret.') | |
except: | |
pass | |
else: | |
print('Token retreived from MSAL Cache....') | |
decodedAccessToken = jwt.decode(accessToken['access_token'], verify=False) | |
accessTokenFormatted = json.dumps(decodedAccessToken, indent=2) | |
print('Decoded Access Token') | |
print(accessTokenFormatted) | |
# Token Expiry | |
tokenExpiry = datetime.fromtimestamp(int(decodedAccessToken['exp'])) | |
print('Token Expires at: ' + str(tokenExpiry)) | |
return | |
except Exception as err: | |
print(err) | |
def msgraph_request(resource,requestHeaders): | |
# Request | |
results = requests.get(resource, headers=requestHeaders).json() | |
return results | |
# Auth | |
msgraph_auth() | |
# Query | |
queryResults = msgraph_request(graphURI +'/v1.0/users',requestHeaders) | |
# Results to Dataframe | |
try: | |
df = pd.read_json(json.dumps(queryResults['value'])) | |
# set ID column as index | |
df = df.set_index('id') | |
print(str(df['displayName'] + " " + df['mail'])) | |
except: | |
print(json.dumps(queryResults, indent=2)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment