次の方法で共有


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

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

このクイックスタートで生成されたサンプル アプリの動作を示す図。

前提条件

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

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

ヒント

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

手順 1:アプリケーションを登録する

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

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

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

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

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

  1. ディスクのルートに近いローカル フォルダーに zip ファイルを抽出します (たとえば C:\Azure-Samples)。
  2. msal-client-credential-secret サブフォルダーに移動します。
  3. src\main\resources\application.properties を編集し、AUTHORITYCLIENT_IDSECRET の各フィールドの値を次のスニペットに置き換えます。
  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 の値を見つけるには、アプリの [概要] ページに移動します。 新しいキーを生成するには、[証明書とシークレット] ページに移動します。

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

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

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

標準ユーザー

あなたがテナントの標準ユーザーである場合は、アプリケーションに対する管理者の同意を与えてくれるように全体管理者に依頼する必要があります。 これを行うには、次の 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:アプリケーションの実行

このサンプルは、IDE から ClientCredentialGrant.java の main メソッドを実行することで直接テストできます。

シェルまたはコマンド ラインから:

$ mvn clean compile assembly:single

これにより、/targets ディレクトリに msal-client-credential-secret-1.0.0.jar ファイルが生成されます。 次のように Java 実行可能ファイルを使用してこれを実行します。

$ java -jar msal-client-credential-secret-1.0.0.jar

実行後、構成済みのテナントに存在するユーザーが一覧表示されます。

重要

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

説明

MSAL Java

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

Maven または Gradle を使用して、アプリケーションに MSAL4J を追加し、アプリケーションの pom.xml (Maven) または build.gradle (Gradle) ファイルに対して以下の変更を行うことで、依存関係を管理します。

pom.xml 内:

<dependency>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>msal4j</artifactId>
    <version>1.0.0</version>
</dependency>

build.gradle 内:

compile group: 'com.microsoft.azure', name: 'msal4j', version: '1.0.0'

MSAL の初期化

MSAL for Java を使用するファイルの先頭に次のコードを追加して、MSAL4J への参照を追加します。

import com.microsoft.aad.msal4j.*;

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

IClientCredential credential = ClientCredentialFactory.createFromSecret(CLIENT_SECRET);

ConfidentialClientApplication cca =
        ConfidentialClientApplication
                .builder(CLIENT_ID, credential)
                .authority(AUTHORITY)
                .build();
各値の説明: 説明
CLIENT_SECRET アプリケーションに対して作成されるクライアント シークレットです。
CLIENT_ID 登録済みアプリケーションのアプリケーション (クライアント) ID です。 この値は、アプリの [概要] ページで確認できます。
AUTHORITY ユーザーが認証するための STS エンドポイント。 通常、パブリック クラウド上では https://login.microsoftonline.com/{tenant} です。{tenant} はご自分のテナントの名前またはテナント ID です。

トークンの要求

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

IAuthenticationResult result;
     try {
         SilentParameters silentParameters =
                 SilentParameters
                         .builder(SCOPE)
                         .build();

         // try to acquire token silently. This call will fail since the token cache does not
         // have a token for the application you are requesting an access token for
         result = cca.acquireTokenSilently(silentParameters).join();
     } catch (Exception ex) {
         if (ex.getCause() instanceof MsalException) {

             ClientCredentialParameters parameters =
                     ClientCredentialParameters
                             .builder(SCOPE)
                             .build();

             // Try to acquire a token. If successful, you should see
             // the token information printed out to console
             result = cca.acquireToken(parameters).join();
         } else {
             // Handle other exceptions accordingly
             throw ex;
         }
     }
     return result;
各値の説明: 説明
SCOPE 要求されるスコープが含まれています。 機密クライアントの場合は、{Application ID URI}/.default のような形式を使用して、要求されるスコープが設定されるアプリ オブジェクト内に静的に定義されたものであることを示す必要があります (Microsoft Graph では、{Application ID URI}https://graph.microsoft.com を指します)。 カスタム Web API の場合、{Application ID URI} は、[アプリの登録][API の公開] セクションに定義されます。

ヘルプとサポート

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

次のステップ

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