Microsoftのツール上ではなく、外部からMicrosoft Graphを利用したいケースがあります。
今回はPythonでMicrosoft Graphを利用する方法を紹介します。
目次 閉じる
認証情報の作成
Microsoft AzureのAzure Active Directoryから「アプリの登録」で新規登録を選択
「名前」欄でアプリの名前を入力します。任意でわかりやすい名前で登録しましょう。
「サポートされているアカウントの種類」で誰がAPIを使用できるか、範囲を指定します。
「リダイレクトURL」の入力は不要です。
ここまで入力したら画面最下部の「登録」をクリックします。
アプリ名を選択し「概要」画面を開き、2つの情報を事前にコピーしておきます。後で実際のコードに利用します。
- アプリケーション(クライアント)ID
- ディレクトリ(テナント)ID
「証明書とシークレット」画面を開き、新しいクライアントシークレットを追加します。
「説明」欄は任意の説明を登録します。
「有効期限」は選択肢の中から選択して、最後に下の「追加」を選択します。
画面上に今登録した内容で「値」と「シークレットID」が表示されるので、コピーしておきます。
「値」はしばらくすると伏せ字に変更されます。後から確認できなくなりますので、必ずコピーして控えて置いてください。
「APIのアクセス許可」画面で、アクセスする権限内容の設定をします。
最初から作成されているUser.Readは使用しないので、削除します。
「アクセス許可の追加」から「Microsoft Graph」を選択します。
設定する内容はMicrosoft learnの記事を参考に設定をしてください。
例えば、SharePointリストにデータを追加する場合は、下記の「Sites.ReadWrite.All、Sites.Manage.All、Sites.FullControl.All」のいずれかを選択します。
アクセス許可の種類 | アクセス許可 (特権の小さいものから大きいものへ) |
---|---|
委任 (職場または学校のアカウント) | Sites.Read.All、Sites.ReadWrite.All、Sites.Manage.All、Sites.FullControl.All |
委任 (個人用 Microsoft アカウント) | サポートされていません。 |
アプリケーション | Sites.Read.All、Sites.ReadWrite.All、Sites.Manage.All、Sites.FullControl.All |
Pythonのコード
今回利用するライブラリは下記の2つです。インストールしてない場合は下記コードでインストールしておいてください。
pip install msal
pip install requests
今回実施したバージョンは下記です。
msal 1.23.0
requests 2.26.0
早速ですが、こちらがコード全文です。
import msal
import requests
# MSALの設定
authority = 'https://login.microsoftonline.com/<YOUR_TENANT_ID>'
client_id = '<YOUR_CLIENT_ID>'
scope = ['https://graph.microsoft.com/.default'] # スコープを指定
app = msal.ConfidentialClientApplication( client_id, authority=authority, client_credential="<YOUR_CLIENT_SECRET>" # クライアントシークレットを指定
)
result = app.acquire_token_silent(scope, account=None)
if not result: # キャッシュされたトークンがない場合、新たにトークンを取得する result = app.acquire_token_for_client(scopes=scope)
if "access_token" in result: # アクセストークンを取得 access_token = result["access_token"] # APIのURLを指定 api_url = "https://graph.microsoft.com/v1.0/<resource>" headers = { 'Authorization': 'Bearer ' + access_token, "Content-Type": "application/json" } data={ # APIのクエリ等をここに } response = requests.post(api_url, headers=headers, json=data) if response.status_code == 201: print("成功") else: print(f"◯◯に失敗しました。. Status code: {response.status_code}")
else: print("MSAL での認証に失敗しました。")
「<YOUR_TENANT_ID>」や、「<YOUR_CLIENT_ID>」、「<YOUR_CLIENT_SECRET>」は上の手順でメモをした値に置き換えてください。
スコープを指定する場所があります。完全に理解はしていませんがが、少し解説します。
(間違いがあればご指摘ください)
scope = ['https://graph.microsoft.com/.default'] # スコープを指定
ユーザーに変わってアクセスする(ユーザー委任のアクセス許可)際に、スコープを設定する必要があり、行うレベルに応じて設定をします。
構文は下記の通り。
ResourceId + <スコープ>
スコープとして設定できる値と内容の一部は下記の通り。それ以外の内容は公式の記事などを確認してください。
値 | 内容 |
.default | すべてのスコープ |
user_impersonation | |
user.read | ユーザーの基本的なプロファイル情報を読み取る |
mail.read | ユーザーのメール情報を読み取る |
calendars.read | ユーザーのカレンダー情報を読み取る |
files.read | ユーザーのファイル情報を読み取る |
Directory.Read | Azure ADの読み取り |
Directory.Write | Azure ADの書き込み |
api_url等はMicrosoft Graphで利用するURLをそのまま入力し、dataにはリクエストbodyを入力します。不要な場合は削除してください。
URlなどは下記の公式記事を確認してください。
取得したアクセストークンは60~90分で期限が切れます。行いたい処理によっては1時間を超える場合は注意が必要です。