クイック スタート: Python デーモン アプリからトークンを取得し、Microsoft Graph を呼び出す

このクイックスタートでは、Python アプリケーションでアプリの ID を使ってアクセス トークンを取得して、Microsoft Graph API を呼び出し、ディレクトリ内のユーザーの一覧を表示する方法を示すコード サンプルをダウンロードして実行します。 このコード サンプルでは、ユーザーの ID ではなく、アプリケーション ID を使用して、無人のジョブまたは Windows サービスを実行する方法を示します。

Diagram showing how the sample app generated by this quickstart works.

前提条件

このサンプルを実行するには、以下が必要です。

クイック スタート アプリを登録してダウンロードする

手順 1:アプリケーションの登録

ヒント

この記事の手順は、開始するポータルによって若干異なる場合があります。

アプリケーションを登録し、その登録情報をソリューションに手動で追加するには、次の手順を実行します。

  1. Microsoft Entra 管理センターにサインインします。
  2. 複数のテナントにアクセスできる場合は、上部のメニューの [設定] アイコン を使い、[ディレクトリとサブスクリプション] メニューからアプリケーションを登録するテナントに切り替えます。
  3. [ID]>[アプリケーション]>[アプリ登録] の順に進み、[新規登録] を選択します。
  4. アプリケーションの名前を入力します (例: Daemon-console)。 この名前は、アプリのユーザーに表示される場合があります。また、後で変更することができます。
  5. 登録 を選択します。
  6. [管理] で、[証明書とシークレット] を選択します。
  7. [クライアント シークレット] で、 [新しいクライアント シークレット] を選択し、名前を入力して、 [追加] を選択します。 後の手順で使用できるように、シークレットの値を安全な場所に記録します。
  8. [管理] で、 [API のアクセス許可]>[アクセス許可の追加] の順に選択します。 [Microsoft Graph] を選択します。
  9. [アプリケーションのアクセス許可] を選択します。
  10. [ユーザー] ノードで、 [User.Read.All] を選択し、 [アクセス許可の追加] を選択します。

手順 2:Python プロジェクトのダウンロード

Python デーモン プロジェクトをダウンロードする

手順 3: Python プロジェクトの構成

  1. ディスクのルートに近いローカル フォルダー (例: C:\Azure-Samples) に zip ファイルを展開します。

  2. サブフォルダー 1-Call-MsGraph-WithSecret に移動します。

  3. parameters.json を編集し、authorityclient_id、および secret フィールドの値を次のスニペットに置き換えます。

    "authority": "https://login.microsoftonline.com/Enter_the_Tenant_Id_Here",
    "client_id": "Enter_the_Application_Id_Here",
    "secret": "Enter_the_Client_Secret_Here"
    

    各値の説明:

    • Enter_the_Application_Id_Here - 登録したアプリケーションのアプリケーション (クライアント) ID
    • Enter_the_Tenant_Id_Here - この値をテナント ID またはテナント名 (例: contoso.microsoft.com) に置き換えます。
    • Enter_the_Client_Secret_Here - この値を手順 1 で作成されたクライアント シークレットに置き換えます。

ヒント

アプリケーション (クライアント) IDディレクトリ (テナント) ID の値を見つけるには、Microsoft Entra 管理センターでアプリの [概要] ページに移動します。 新しいキーを生成するには、[証明書とシークレット] ページに移動します。

この時点でアプリケーションを実行すると、HTTP 403 - Forbidden エラー "Insufficient privileges to complete the operation" が表示されます。 このエラーは、すべての "アプリ専用のアクセス許可" には管理者の同意が必要であるために発生します。ディレクトリの全体管理者がお使いのアプリケーションに同意する必要があります。 ご自身のロールに応じて、次のオプションのいずれかを選択します。

グローバル テナント管理者

グローバル テナント管理者の場合は、Microsoft Entra 管理センターで [アプリの登録][API のアクセス許可] ページに移動し、[<テナント名> に管理者の同意を与えます] (<テナント名> はお使いのディレクトリの名前です) を選択します。

標準ユーザー

テナントの標準ユーザーの場合は、お使いのアプリケーションに管理者の同意を与えるようグローバル管理者に依頼してください。 これを行うには、次の URL を管理者に知らせます。

https://login.microsoftonline.com/Enter_the_Tenant_Id_Here/adminconsent?client_id=Enter_the_Application_Id_Here

各値の説明:

  • Enter_the_Tenant_Id_Here - この値をテナント ID またはテナント名 (例: contoso.microsoft.com) に置き換えます。
  • Enter_the_Application_Id_Here - 以前に登録したアプリケーションのアプリケーション (クライアント) ID です。

手順 5:アプリケーションの実行

このサンプルの依存関係を 1 回インストールする必要があります。

pip install -r requirements.txt

次に、コマンド プロンプトまたはコンソールを使用して、アプリケーションを実行します。

python confidential_client_secret_sample.py parameters.json

コンソール出力には、Microsoft Entra ディレクトリ内のユーザーの一覧を表すいくつかの JSON フラグメントが表示されます。

重要

このクイック スタート アプリケーションは、クライアント シークレットを使用して、それ自体を機密クライアントとして識別します。 クライアント シークレットはプロジェクト ファイルにプレーン テキストとして追加されるため、セキュリティ上の理由から、アプリケーションを運用アプリケーションと見なす前に、クライアント シークレットの代わりに証明書を使用することをお勧めします。 証明書の使用方法の詳細については、このサンプルと同じ GitHub リポジトリの 2 つ目のフォルダー 2-Call-MsGraph-WithCertificate にあるこれらの手順を参照してください。

詳細情報

MSAL Python

MSAL Python は、ユーザーをサインインし、Microsoft ID プラットフォームによって保護されている API にアクセスするトークンを要求するために使用するライブラリです。 説明したとおり、このクイック スタートでは、委任されたアクセス許可ではなく、アプリケーション自体の ID を使用してトークンを要求しています。 ここで使用される認証フローは、" クライアント資格情報 OAuth フロー " と呼ばれます。 デーモン アプリでの MSAL Python の使用方法の詳細については、この記事を参照してください。

MSAL Python は、次の pip コマンドを実行してインストールできます。

pip install msal

MSAL の初期化

MSAL への参照を追加するには、次のコードを追加します。

import msal

続いて、次のコードを使用して MSAL を初期化します。

app = msal.ConfidentialClientApplication(
    config["client_id"], authority=config["authority"],
    client_credential=config["secret"])
各値の説明: 説明
config["secret"] Microsoft Entra 管理センターでアプリケーションに対して作成されるクライアント シークレットです。
config["client_id"] Microsoft Entra 管理センターに登録されているアプリケーションの [アプリケーション (クライアント) ID]。 この値は、Microsoft Entra 管理センターのアプリの [概要] ページで確認できます。
config["authority"] ユーザーが認証するための STS エンドポイント。 通常、パブリック クラウド上では https://login.microsoftonline.com/{tenant} です。{tenant} はご自分のテナントの名前またはテナント ID です。

詳細については、ConfidentialClientApplication のリファレンス ドキュメントを参照してください。

トークンの要求

アプリの ID を使用してトークンを要求するには、AcquireTokenForClient メソッドを使用します。

result = None
result = app.acquire_token_silent(config["scope"], account=None)

if not result:
    logging.info("No suitable token exists in cache. Let's get a new one from AAD.")
    result = app.acquire_token_for_client(scopes=config["scope"])
各値の説明: 説明
config["scope"] 要求されるスコープが含まれています。 機密クライアントの場合は、{Application ID URI}/.default のような形式を使用して、要求されるスコープが Microsoft Entra 管理センターで設定されるアプリ オブジェクト内に静的に定義されたものであることを示す必要があります (Microsoft Graph では、{Application ID URI}https://graph.microsoft.com を指します)。 カスタム Web API の場合、{Application ID URI} は、Microsoft Entra 管理センターの [アプリの登録][API の公開] セクションで定義します。

詳細については、AcquireTokenForClient のリファレンス ドキュメントを参照してください。

ヘルプとサポート

サポートが必要な場合、問題をレポートする場合、またはサポート オプションについて知りたい場合は、開発者向けのヘルプとサポートに関するページを参照してください。

次のステップ

デーモン アプリケーションの詳細については、シナリオのランディング ページを参照してください。