Java WebLogic アプリでユーザーのサインインと Microsoft Graph へのアクセスを有効にする

この記事では WebLogic アプリについて、ユーザーのサインインと、Microsoft Graph を呼び出すために必要なアクセス トークンの取得機能を紹介します。 Java 用 Microsoft 認証ライブラリ (MSAL) を使用します。

次の図は、アプリのトポロジを示しています。

アプリのトポロジを示す図。

クライアント アプリは、MSAL for Java (MSAL4J) を使用してユーザーのサインインを行い、Microsoft Graphアクセス トークンを Microsoft Entra ID から取得します。 アクセス トークンにより、ユーザーはスコープで定義されているとおり、Microsoft Graph API エンドポイントにアクセスする権限を持つことが証明されます。

前提条件

  • Java 8 以上
  • Maven 3
  • Microsoft Entra ID テナント。 詳細については、「Microsoft Entra ID テナントの取得方法」をご覧ください。
  • 組織のディレクトリ内のアカウント (シングルテナント モード) のみを操作する場合は、独自の Microsoft Entra ID テナント内のユーザー アカウント。 テナントにまだユーザー アカウントを作成していない場合は、作成してから続行する必要があります。 詳細については、「ユーザーを作成、招待、削除する方法」をご覧ください。
  • 組織のディレクトリ (マルチテナント モード) のアカウントを操作する場合は、任意の組織の Microsoft Entra ID テナントのユーザー アカウント。 このサンプルを、個人の Microsoft アカウントで動作するように変更する必要があります。 テナントにまだユーザー アカウントを作成していない場合は、作成してから続行する必要があります。 詳細については、「ユーザーを作成、招待、削除する方法」をご覧ください。
  • 個人の Microsoft アカウントを使用する場合は、個人の (Xbox、Hotmail、Live などの) Microsoft アカウントを使用します。

推奨事項

  • Java / Jakarta Servlets に関するある程度の知識。
  • Linux/OSX terminal ターミナルまたは Windows PowerShell に関するある程度の知識。
  • トークンの検査に必要な jwt.ms
  • ネットワークの活動監視とトラブルシューティングに必要な Fiddler
  • 開発に関する最新の情報について、Microsoft Entra ID ブログを確認してください。

サンプルのセットアップ

次のセクションでは、サンプル アプリケーションを設定する方法を示します。

サンプル リポジトリを複製またはダウンロードする

サンプルを複製するには、Bash ウィンドウを開き、次のコマンドを使用します。

git clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git
cd 3-java-servlet-web-app/2-Authorization-I/call-graph

または、ms-identity-msal-java-samples リポジトリに移動し、.zip ファイルとしてダウンロードしてハード ドライブに展開します。

重要

Windows でファイル パスの長さが制限を超える場合は、ハード ドライブのルート近くのディレクトリにリポジトリを複製または展開してください。

Microsoft Entra ID テナントにサンプル アプリケーションを登録する

このサンプルには、プロジェクトが 1 つ存在します。 次のセクションでは、Azure portal を使用してアプリを登録する方法について説明します。

アプリケーションを作成する Microsoft Entra ID テナントを選択する

テナントを選択するには、次の手順に従います。

  1. Azure portal にサインインします。

  2. ご利用のアカウントが複数の Microsoft Entra ID テナントに存在する場合は、Azure portal の隅にあるプロファイルを選択し、ディレクトリの切り替えを選択して、セッションを目的の Microsoft Entra ID テナントに変更します。

アプリを登録する (java-servlet-webapp-call-graph)

最初に、クイック スタート: Microsoft ID プラットフォームにアプリケーションを登録するに記載された説明に従って Azure portal に新しいアプリを登録します。

次の手順を実行して、登録を完了します。

  1. 開発者用の Microsoft ID プラットフォームの [アプリの登録] ページに移動します。

  2. [新規登録] を選択します。

  3. 表示される アプリケーションの登録ページで、アプリケーションの登録情報を入力します。

    • 名前セクションに、アプリのユーザーに表示されるわかりやすいアプリケーション名を入力します (例: java-servlet-webapp-call-graph)。

    • サポートされているアカウントの種類で、次のオプションのいずれかを選択します。

      • 自分のテナントのユーザーのみが使用するアプリケーションをビルドしている場合は (シングルテナント アプリケーション)、この組織のディレクトリ内のアカウントのみを選択します。
      • Microsoft Entra ID テナントのユーザーがアプリケーション (マルチテナント アプリケーション) を使用できるようにする場合は、任意の組織ディレクトリのアカウントを選択します。
      • 最も広い顧客のセット (つまり、Microsoft 個人用アカウントもサポートするマルチテナント アプリケーション) に対して、任意の組織ディレクトリのアカウントと個人用 Microsoft アカウントを選択します。
    • 個人用の Microsoft アカウント (Hotmail、Live、Skype、Xbox アカウントなど) のユーザーのみが使用する場合は、個人用の Microsoft アカウントを選択します。

    • リダイレクト URI セクションで、コンボ ボックスの Web を選択し、リダイレクト URI: http://localhost:8080/msal4j-servlet-graph/auth/redirect を入力します。

  4. [登録] を選択して、アプリケーションを作成します。

  5. アプリの登録ページで、アプリケーション (クライアント) ID の値を見つけてメモします。 この値は、後ほどアプリの構成ファイルで使用します。

  6. [保存] を選択して変更を保存します。

  7. アプリの登録ページで、ナビゲーション ペインにある 証明書とシークレットを選択してページを開き、シークレットの生成と証明書のアップロードを行います。

  8. [クライアント シークレット] セクションで、 [新しいクライアント シークレット] を選択します。

  9. キーの説明 (例: アプリのシークレット) を入力します。

  10. 1 年2 年無期限のいずれかの期間を選びます。

  11. [追加] を選択します。 生成された値が表示されます。

  12. 生成した値をコピーしてから保存します。 この値は後ほど、コードの構成ファイルに使用します。 この値は二度と表示されず、他の方法でも取得はできません。 そのため、必ず Azure portal から保存した後に、他の画面やペインに移動してください。

  13. アプリの登録ページで、ナビゲーション ペインから API のアクセス許可を選択してページを開き、アプリケーションで必要となる API へのアクセス許可を追加します。

  14. [アクセス許可の追加] を選択します.

  15. [Microsoft API] タブが選択されていることを確認します。

  16. [よく使用される Microsoft API] セクションで、 [Microsoft Graph] を選択します。

  17. [委任されたアクセス許可] セクションで、一覧から [User.Read] を選択します。 必要に応じて検索ボックスを使用します。

  18. [アクセス許可の追加] を選択します.


アプリの登録を使用するためにアプリ (java-servlet-webapp-call-graph) を構成する

アプリを構成するには、次の手順に従います。

Note

以降の手順では、ClientIDApplication ID または AppId と同じです。

  1. IDE でプロジェクトを開きます。

  2. ./src/main/resources/authentication.properties ファイルを開きます。

  3. {enter-your-tenant-id-here} という文字列を見つけます。 既存の値を次のいずれかの値に置き換えます。

    • この組織のディレクトリのみのオプションでアカウントにアプリを登録した場合は、Microsoft Entra ID の テナント ID。
    • 任意の組織ディレクトリ内のアカウントオプションでアプリを登録した場合は、organizations という単語。
    • 任意の組織のディレクトリ内のアカウントと、個人用の Microsoft アカウントオプションでアプリを登録した場合は、commonという単語。
    • 個人用 Microsoft アカウント オプションでアプリを登録した場合は、consumers という単語。
  4. {enter-your-client-id-here} という文字列を見つけて、既存の値をアプリケーション ID または Azure portal からコピーした java-servlet-webapp-call-graph アプリケーションの clientId に変更します。

  5. {enter-your-client-secret-here} という文字列を見つけて、既存の値を、Azure portal で java-servlet-webapp-call-graph アプリを作成するときに保存した値に置き換えます。

サンプルをビルドする

Maven を使用してサンプルをビルドするには、サンプルの pom.xml ファイルが含まれているディレクトリに移動して、次のコマンドを実行します。

mvn clean package

このコマンドを実行すると、 さまざまなアプリケーション サーバーで実行できる .war ファイルが生成されます。

サンプルのデプロイ

以降の手順では、WebLogic をインストールし、いくつかサーバー ドメインをセットアップします。

WebLogic にデプロイする前に、次の手順を使用してサンプル本体の構成を変更してから、パッケージをビルドまたはリビルドする必要があります。

  1. サンプルで、クライアント ID、テナント、リダイレクト URL などを構成した application.properties ファイルまたは authentication.properties ファイルを探します。

  2. このファイルで、localhost:8080 または localhost:8443 への参照を、WebLogic が実行される URL とポートに変更します。既定では localhost:7001 になります。

  3. また、Azure アプリの登録でも同じ変更を行う必要があります。Azure portal で、認証タブのリダイレクト URI の値に対し、これを設定してください。

Web コンソールを使用してサンプルを WebLogic にデプロイするには、次の手順に従います。

  1. DOMAIN_NAME\bin\startWebLogic.cmd を使用して WebLogic サーバーを起動します。

  2. ブラウザーで WebLogic web コンソール (http://localhost:7001/console) に移動します。

  3. ドメイン構造>デプロイに移動し、インストールファイルのアップロードの順に選択して、Maven を使用してビルドする .war ファイルを探します。

  4. [この展開をアプリケーションとしてインストールする] を選択し、次へを選択します。終了を選択して、保存を選択します。

  5. ほとんどの設定は既定のままで問題ありませんが、サンプル構成または Azure アプリの登録で設定したリダイレクト URI と一致するようにアプリケーションを指定する必要があります。 つまり、リダイレクト URI が http://localhost:7001/msal4j-servlet-auth であれば、アプリケーション名を msal4j-servlet-auth にする必要があります。

  6. ドメイン構造>のデプロイに戻り、アプリケーションを起動します。

  7. アプリケーションが起動したら、http://localhost:7001/<application-name>/ に移動します。これで、アプリケーションにアクセスできます。

サンプルの確認

次の手順に従ってサンプルを操作します。

  1. サインインまたはサインアウトの状態が、画面の中央に表示されます。
  2. 画面の隅にある状況依存ボタンを選択します。 このボタンは、アプリを最初に実行するときにサインインと表示します。
  3. 次のページに記載された指示に従い、Microsoft Entra ID テナントのアカウントでサインインします。
  4. 同意画面に、必要となるスコープが表示されます。
  5. 状況依存ボタンの表示がサインアウトに変わり、ユーザー名が表示されます。
  6. ID トークンの詳細を選択すると、ID トークンのデコードされた要求の一部が表示されます。
  7. Graph を呼び出すを選択して Microsoft Graph の /me エンドポイント を呼び出し、取得したユーザーの詳細の選択を確認します。
  8. 画面隅のボタンを使用してサインアウトします。

コードについて

このサンプルでは、MSAL for Java (MSAL4J) を使用してユーザーのサインインを行い、Microsoft Graph API のトークンを取得します。 Graph からのデータの取得には、Microsoft Graph SDK for Java を使用します。 Maven を使用して、これらのライブラリをプロジェクトに追加する必要があります。

このサンプルの動作をレプリケートする場合は、src/main/java/com/microsoft/azuresamples/msal4j フォルダーにある pom.xml ファイルと、helpers フォルダーおよび authservlets フォルダーの内容をコピーします。 authentication.properties ファイルも必要です。 これらのクラスとファイルには、さまざまなアプリケーションで使用できる汎用コードが含まれています。 サンプルの残りもコピーできますが、他のクラスとファイルは、このサンプルの目的に合わせて特別にビルドされたものです。

内容

次の表に、サンプル プロジェクト フォルダーの内容を示します。

ファイル/フォルダー 説明
src/main/java/com/microsoft/azuresamples/msal4j/callgraphwebapp/ このディレクトリには、アプリの基幹業務ロジックを定義するクラスが含まれています。
src/main/java/com/microsoft/azuresamples/msal4j/authservlets/ このディレクトリには、サインインとサインアウトのエンドポイントに使用されるクラスが含まれています。
____Servlet.java 使用可能なすべてのエンドポイントは、末尾が ____Servlet.java である .java クラスに定義されます。
src/main/java/com/microsoft/azuresamples/msal4j/helpers/ 認証に使用するヘルパー クラス。
AuthenticationFilter.java 認証されていない要求を、保護されたエンドポイントの 401 ページにリダイレクトします。
src/main/resources/authentication.properties Microsoft Entra ID とプログラム構成。
src/main/webapp/ このディレクトリには UI - JSP テンプレートが含まれています
CHANGELOG.md サンプルに対する変更の一覧。
CONTRIBUTING.md サンプルに貢献するためのガイドライン。
ライセンス サンプルのライセンス。

ConfidentialClientApplication

ConfidentialClientApplication インスタンスが AuthHelper.java ファイルに作成されます (次の例を参照)。 このオブジェクトにより Microsoft Entra ID 認証 URL の作成と、アクセス トークンの認証トークンの交換が行われます。

// getConfidentialClientInstance method
IClientSecret secret = ClientCredentialFactory.createFromSecret(SECRET);
confClientInstance = ConfidentialClientApplication
                     .builder(CLIENT_ID, secret)
                     .authority(AUTHORITY)
                     .build();

インスタンス化には次のパラメーターが使用されます。

  • アプリのクライアント ID。
  • クライアント シークレット。機密クライアント アプリケーションに必要です。
  • Microsoft Entra ID 認証機関。Microsoft Entra テナント ID が含まれます。

上記の例では、Config.java ファイルにあるプロパティ リーダ0を使用して、値が authentication.properties ファイルから読み取られます。

ステップバイステップのチュートリアル

次の手順で、アプリの機能をチュートリアルで紹介します。

  1. サインイン プロセスの最初のステップでは、Microsoft Entra ID テナントの /authorize エンドポイントに要求を送信します。 承認要求の URL を作成するには、MSAL4J の ConfidentialClientApplication インスタンスを利用します。 アプリでブラウザーをこの URL にリダイレクトし、ユーザーはそこでサインインします。

    final ConfidentialClientApplication client = getConfidentialClientInstance();
    AuthorizationRequestUrlParameters parameters = AuthorizationRequestUrlParameters.builder(Config.REDIRECT_URI, Collections.singleton(Config.SCOPES))
            .responseMode(ResponseMode.QUERY).prompt(Prompt.SELECT_ACCOUNT).state(state).nonce(nonce).build();
    
    final String authorizeUrl = client.getAuthorizationRequestUrl(parameters).toString();
    contextAdapter.redirectUser(authorizeUrl);
    

    このコードの機能を次の一覧で示します。

    • AuthorizationRequestUrlParameters: をビルド AuthorizationRequestUrlするために設定する必要があるパラメーター。
    • REDIRECT_URI: Microsoft Entra ID がユーザー資格情報を収集した後、認証コードと共にブラウザーをリダイレクトする場所。 これは Azure portal にある Microsoft Entra ID アプリ登録のリダイレクト URI と一致する必要があります。
    • SCOPES: スコープはアプリケーションで要求されるアクセス許可です。
      • 通常、ID トークンの応答を受信するには、openid profile offline_access の 3 つのスコープがあれば十分です。
      • authentication.properties ファイルに、アプリで要求されるすべてのスコープの一覧が入力されています。 など User.Read、さらにスコープを追加できます。
  2. Microsoft Entra ID により、ユーザーにサインイン プロンプトが表示されます。 サインインが成功すると、ユーザーのブラウザーはアプリのリダイレクト エンドポイントにリダイレクトされます。 このエンドポイントへの有効な要求には、、認証コードが含まれています。

  3. その後、この承認コードは、ConfidentialClientApplication のインスタンスによって、Microsoft Entra ID の ID トークンとアクセス トークンに交換されます。

    // First, validate the state, then parse any error codes in response, then extract the authCode. Then:
    // build the auth code params:
    final AuthorizationCodeParameters authParams = AuthorizationCodeParameters
            .builder(authCode, new URI(Config.REDIRECT_URI)).scopes(Collections.singleton(Config.SCOPES)).build();
    
    // Get a client instance and leverage it to acquire the token:
    final ConfidentialClientApplication client = AuthHelper.getConfidentialClientInstance();
    final IAuthenticationResult result = client.acquireToken(authParams).get();
    

    このコードの機能を次の一覧で示します。

    • AuthorizationCodeParameters: ID トークンやアクセス トークンと承認コードを交換するために設定する必要があるパラメーター。
    • authCode: リダイレクト エンドポイントで受信された承認コード。
    • REDIRECT_URI: 前のステップで使用したリダイレクト URI を、再度渡す必要があります。
    • SCOPES: 前のステップで使用したスコープを、再度渡す必要があります。
  4. acquireToken が成功すると、トークン クレームが抽出されます。 nonce チェックに合格すると、結果は context (IdentityContextData のインスタンス) に配置されて、セッションに保存されます。 その後、アプリケーションでそれにアクセスする必要があるときは常に、セッションから (IdentityContextAdapterServlet のインスタンスを使用して) IdentityContextData をインスタンス化できます。

    // parse IdToken claims from the IAuthenticationResult:
    // (the next step - validateNonce - requires parsed claims)
    context.setIdTokenClaims(result.idToken());
    
    // if nonce is invalid, stop immediately! this could be a token replay!
    // if validation fails, throws exception and cancels auth:
    validateNonce(context);
    
    // set user to authenticated:
    context.setAuthResult(result, client.tokenCache().serialize());
    

ルートを保護する

サンプル アプリでルートへのアクセスをフィルター処理する方法については、「AuthenticationFilter.java」を参照してください。 authentication.properties ファイルを見ると、認証済みのユーザーだけがアクセスできるルートが app.protect.authenticated プロパティにコンマで区切って入力されていることがわかります (次の例を参照)。

# for example, /token_details requires any user to be signed in and does not require special roles or groups claim(s)
app.protect.authenticated=/token_details, /call_graph

グラフの呼び出し

ユーザーが /call_graph に移動すると、アプリケーションによって IGraphServiceClient(Java Graph SDK) のインスタンスが作成されて、サインインしたユーザーのアクセス トークンが渡されます。 Graph クライアントにより、要求の Authorization ヘッダーにアクセス トークンが設定されます。 その後、アプリによって Graph クライアントに、Microsoft Graph の /me エンドポイントを呼び出して、現在サインインしているユーザーの詳細を生成することが要求されます。

スコープを持つ User.Read Graph Service の有効なアクセス トークンが既にある場合は、エンドポイントへの /me アクセスを取得するために次のコードのみが必要です。

//CallGraphServlet.java
User user = GraphHelper.getGraphClient(contextAdapter).me().buildRequest().get();

スコープ

スコープはアプリケーションが要求するアクセス レベルを Microsoft Entra ID に通知します。

Microsoft Entra ID は、要求されたスコープに基づいて、サインイン時にユーザーに同意ダイアログを表示します。 ユーザーが 1 つ以上のスコープに同意してトークンを取得すると、同意先のスコープが結果の access_token にエンコードされます。

アプリケーションで要求されるスコープについては、authentication.properties を参照してください。 既定では、アプリケーションはスコープの値を User.Read に設定します。 Microsoft Graph API のこのスコープが、現在サインインしているユーザーの情報にアクセスするためのスコープです。 この情報にアクセスするためのグラフ エンドポイントは https://graph.microsoft.com/v1.0/me です。 このエンドポイントに対して行われる有効な要求には、Authorization ヘッダー内のスコープ User.Read を含む access_token が必要です。

詳細

次のステップ

Azure Virtual Machines 上の WebLogic に Java WebLogic アプリをデプロイする