📝

Microsoft Graph APIを使用したEntra IDからの情報取得

2024/11/28に公開

1. はじめに

Microsoft Graph APIとは:
Microsoft 365、Entra IDを操作するAPI。このAPIを使用することで、ユーザーやグループ情報、メールなど、Microsoftクラウドリソースにアクセスでます。
https://learn.microsoft.com/ja-jp/graph/overview

Entra IDとは:
MicrosoftのID管理サービスで、Microsoft 365、Azure portalnなどの管理を提供。
https://learn.microsoft.com/ja-jp/entra/fundamentals/what-is-entra

記事の目的:
「Microsoft Graph APIを活用してEntra IDから情報を取得する方法」を解説しMicrosoft Graph APIの理解を深めることを目的としています。

2. Microsoft Graph APIを活用してEntra IDから情報を取得するために必要な事前準備

2.1 Microsoft Entra IDを利用して認証・認可を行うために必要なアプリケーションのエントリを登録

1.「アプリの登録」メニューを開き、「+ 新規登録」をクリック。

2.次の項目を入力して登録をクリック。
名前: test1

2.2 作成したアプリケーションのアプリケーション (クライアント) IDの確認

  1. 概要タブからアプリケーション (クライアント) IDを確認します。
    これは後ほど記載しているプログラムのclient_id = "YOUR_CLIENT_ID"に記載します。

2.3 作成したアプリケーションに対してクライアントシークレット(アプリケーションとMicrosoft Entra ID間の通信担保のため)の作成

  1. 左側メニューの「証明書とシークレット」を開く。
    「+ 新しいクライアントシークレット」をクリック。

2.次の項目を入力し追加をクリック。
名前: test

3.作成後に表示されるクライアントシークレットの値を確認します。シークレットIDではありません。こちらをプログラムのclient_secret = "YOUR_CLIENT_SECRET"に記載します。

注意:
シークレット値は一度しか表示されないようです。

2.4 アプリケーションに権限の追加

1.左側メニューの「APIのアクセス許可」を開き「+ アクセス許可の追加」をクリック。

2.「Microsoft Graph」を選択。

3.「アプリケーションの権限」を選択次の項目を入力して登録をクリック。
アクセス許可:User.Read.All,Group.Read.All(実施したプログラムによって権限は変わります)

2.5 Python環境の構築

  1. Python のインストール
    以下URLからダウンロード。インストール時に「Add Python to PATH」にチェックを入れておいた方が良いです。

https://www.python.org/downloads/release/python-3130/

インストール後は以下のように確認で来ます。

PS C:\work\Azure> python --version
Python 3.13.0
  1. requests のインストール
    requests を使うと、HTTPリクエストを簡単に記述できるためインストールを行います。requestsの詳細は以下のURLがわかりやすいかと思います。
    https://ai-inter1.com/python-requests/
PS C:\work\Azure> pip install requests

https://ai-inter1.com/python-requests/

3. Microsoft Graph APIを使った情報取得

以下のプログラムを実行しユーザー情報取得とグループ情報取得を実施しています。
トークンを取得してそのトークンからアクセスを行い情報の取得といった流れです。

import requests

# Azure AD認証情報
tenant_id = "YOUR_TENANT_ID"  # ディレクトリID
client_id = "YOUR_CLIENT_ID"  # アプリケーションID
client_secret = "YOUR_CLIENT_SECRET"  # クライアントシークレットの値(IDではない)
auth_url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token"

# トークン取得
def get_access_token():
    payload = {
        "client_id": client_id,
        "client_secret": client_secret,
        "grant_type": "client_credentials",
        "scope": "https://graph.microsoft.com/.default",
    }
    response = requests.post(auth_url, data=payload)
    response.raise_for_status()
    return response.json()["access_token"]

# ユーザー情報取得
def get_all_users(access_token):
    headers = {"Authorization": f"Bearer {access_token}"}
    response = requests.get("https://graph.microsoft.com/v1.0/users", headers=headers)
    response.raise_for_status()
    return response.json()

# グループ情報取得
def get_all_groups(access_token):
    headers = {"Authorization": f"Bearer {access_token}"}
    response = requests.get("https://graph.microsoft.com/v1.0/groups", headers=headers)
    response.raise_for_status()
    return response.json()

if __name__ == "__main__":
    token = get_access_token()
    
    # ユーザー情報の取得
    users = get_all_users(token)
    print("ユーザー情報:")
    for user in users["value"]:
        print(f"名前: {user['displayName']}, メール: {user['mail']}")

    # グループ情報の取得
    groups = get_all_groups(token)
    print("\nグループ情報:")
    for group in groups["value"]:
        print(f"グループ名: {group['displayName']}, ID: {group['id']}")

実行結果として以下の値が返ります。xxxxでマスクしていますが、ユーザ情報とグループ情報が正しく返ってきます。

PS C:\work\Azure> python main.py
ユーザー情報:
名前: admin1, メール: None
名前: user1, メール: None
名前: Aki Xxxxx, メール: xxxx.xxxx@gmail.com

グループ情報:
グループ名: AAD DC Administrators, ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
グループ名: prod__admin_group, ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
グループ名: prod_user_group, ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
グループ名: 既定のディレクトリ, ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

キャプチャ↓

4. まとめ

Microsoft Graph APIを活用することで、Entra IDのユーザー情報やグループ情報を効率的に取得できる!

Discussion