Microsoft Entra ID を使用して Java WebLogic アプリのサインインを有効にする

この記事では、Java WebLogic アプリについて、Microsoft Authentication Library (MSAL) for Java を使用した Microsoft Entra ID テナントへのユーザーのサインイン機能を紹介します。

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

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

クライアント アプリではユーザーが MSAL for Java (MSAL4J) を使用して自分の Microsoft Entra ID テナントにサインインし、Microsoft Entra ID から ID トークンを取得します。 この ID トークンにより、このテナントでユーザーが認証されます。 アプリは、ユーザーの認証状態に応じてルートを保護します。

前提条件

  • JDK - バージョン 8 以降
  • Maven 3
  • Microsoft Entra ID テナント。 詳細については、「Microsoft Entra ID テナントの取得方法」をご覧ください。
  • 組織のディレクトリ内のアカウント (シングルテナント モード) のみを操作する場合は、独自の Microsoft Entra ID テナント内のユーザー アカウント。 Microsoft Entra ID テナントにユーザー アカウントを作成していない場合は、作成してから続行する必要があります。 詳細については、「ユーザーを作成、招待、削除する方法」をご覧ください。
  • 組織のディレクトリ (マルチテナント モード) のアカウントを操作する場合は、任意の組織の Microsoft Entra ID テナントのユーザー アカウント。 個人の Microsoft アカウントを使用するには、このサンプルを変更する必要があります。 Microsoft Entra ID テナントにユーザー アカウントをまだ作成していない場合は、作成してから続行する必要があります。 詳細については、「ユーザーを作成、招待、削除する方法」をご覧ください。
  • 個人の 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/1-Authentication/sign-in

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

重要

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


アプリの登録を使用するようにアプリを構成する

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

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-authentication アプリケーションの clientId に変更します。

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

サンプルをビルドする

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. 画面隅のボタンを使用してサインアウトします。
  8. サインアウトした後、ID トークンの詳細を選択して、ユーザーが承認されていない場合に、アプリに ID トークン要求の代わりに表示される 401: unauthorized エラーを確認します。

コードについて

このサンプルでは、MSAL for Java (MSAL4J) を使用して Microsoft Entra ID テナントへのユーザーのサインインを行う方法を示します。 独自のアプリケーションで MSAL4J を使用する場合は、Maven を使用してプロジェクトに追加する必要があります。

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

内容

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

ファイル/フォルダー 説明
src/main/java/com/microsoft/azuresamples/msal4j/authwebapp/ このディレクトリには、アプリの基幹業務ロジックを定義するクラスが含まれています。
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 のテナント 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 claim(s)
app.protect.authenticated=/token_details

スコープ

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

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

アプリケーションで要求されるスコープについては、authentication.properties を参照してください。 これらの 3 つのスコープは MSAL で要求され、既定で Microsoft Entra ID によって指定されます。

詳細

次のステップ

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