【Python】Microsoft Graphを利用する方法

4 min
【Python】Microsoft Graphを利用する方法

記事内に広告を含む場合があります。このサイトの記事内では「アフィリエイト広告」などの広告を掲載している場合があります。消費者庁が問題としている「誇大な宣伝や表現」とならないよう配慮しコンテンツを制作しておりますのでご安心ください。問題のある表現がありましたら、お問い合わせいただけますと幸いです。

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 での認証に失敗しました。")

手順1:テナントIDなどをメモした値に置き換える

「<YOUR_TENANT_ID>」や、「<YOUR_CLIENT_ID>」、「<YOUR_CLIENT_SECRET>」は上の手順でメモをした値に置き換えてください。

手順2:スコープについて

スコープを指定する場所があります。完全に理解はしていませんがが、少し解説します。
(間違いがあればご指摘ください)

scope = ['https://graph.microsoft.com/.default']  # スコープを指定

ユーザーに変わってアクセスする(ユーザー委任のアクセス許可)際に、スコープを設定する必要があり、行うレベルに応じて設定をします。

構文は下記の通り。

ResourceId + <スコープ>

スコープとして設定できる値と内容の一部は下記の通り。それ以外の内容は公式の記事などを確認してください。

内容
.defaultすべてのスコープ
user_impersonation
user.readユーザーの基本的なプロファイル情報を読み取る
mail.readユーザーのメール情報を読み取る
calendars.readユーザーのカレンダー情報を読み取る
files.readユーザーのファイル情報を読み取る
Directory.ReadAzure ADの読み取り
Directory.WriteAzure ADの書き込み

手順3:APIについて

api_url等はMicrosoft Graphで利用するURLをそのまま入力し、dataにはリクエストbodyを入力します。不要な場合は削除してください。

URlなどは下記の公式記事を確認してください。

トークンの有効期間について

取得したアクセストークンは60~90分で期限が切れます。行いたい処理によっては1時間を超える場合は注意が必要です。

参考

ふー

ふー

Microsoft Power Platformを使ったり、ガジェットを買ったり、アニメ見たり、バイクに乗ったり、色々しています。

FOLLOW

関連記事

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA