Java WebSphere アプリでユーザーのサインインと Microsoft Graph へのアクセスを有効にする
この記事では WebSphere アプリについて、ユーザーのサインインと、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 ターミナルに関するある程度の知識。
- トークンの検査に必要な 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 テナントを選択する
テナントを選択するには、次の手順に従います。
Azure portal にサインインします。
ご利用のアカウントが複数の Microsoft Entra ID テナントに存在する場合は、Azure portal の隅にあるプロファイルを選択し、ディレクトリの切り替えを選択して、セッションを目的の Microsoft Entra ID テナントに変更します。
アプリを登録する (java-servlet-webapp-call-graph)
最初に、クイック スタート: Microsoft ID プラットフォームにアプリケーションを登録するに記載された説明に従って Azure portal に新しいアプリを登録します。
次の手順を実行して、登録を完了します。
開発者用の Microsoft ID プラットフォームの [アプリの登録] ページに移動します。
[新規登録] を選択します。
表示される アプリケーションの登録ページで、アプリケーションの登録情報を入力します。
名前セクションに、アプリのユーザーに表示されるわかりやすいアプリケーション名を入力します (例:
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
を入力します。
[登録] を選択して、アプリケーションを作成します。
アプリの登録ページで、アプリケーション (クライアント) ID の値を見つけてメモします。 この値は、後ほどアプリの構成ファイルで使用します。
[保存] を選択して変更を保存します。
アプリの登録ページで、ナビゲーション ペインにある 証明書とシークレットを選択してページを開き、シークレットの生成と証明書のアップロードを行います。
[クライアント シークレット] セクションで、 [新しいクライアント シークレット] を選択します。
キーの説明 (例: アプリのシークレット) を入力します。
1 年、2 年、無期限のいずれかの期間を選びます。
[追加] を選択します。 生成された値が表示されます。
生成した値をコピーしてから保存します。 この値は後ほど、コードの構成ファイルに使用します。 この値は二度と表示されず、他の方法でも取得はできません。 そのため、必ず Azure portal から保存した後に、他の画面やペインに移動してください。
アプリの登録ページで、ナビゲーション ペインから API のアクセス許可を選択してページを開き、アプリケーションで必要となる API へのアクセス許可を追加します。
[アクセス許可の追加] を選択します.
[Microsoft API] タブが選択されていることを確認します。
[よく使用される Microsoft API] セクションで、 [Microsoft Graph] を選択します。
[委任されたアクセス許可] セクションで、一覧から [User.Read] を選択します。 必要に応じて検索ボックスを使用します。
[アクセス許可の追加] を選択します.
アプリの登録を使用するためにアプリ (java-servlet-webapp-call-graph) を構成する
アプリを構成するには、次の手順に従います。
Note
以降の手順では、ClientID
は Application ID
または AppId
と同じです。
IDE でプロジェクトを開きます。
./src/main/resources/authentication.properties ファイルを開きます。
{enter-your-tenant-id-here}
という文字列を見つけます。 既存の値を次のいずれかの値に置き換えます。- この組織のディレクトリのみのオプションでアカウントにアプリを登録した場合は、Microsoft Entra ID の テナント ID。
- 任意の組織ディレクトリ内のアカウントオプションでアプリを登録した場合は、
organizations
という単語。 - 任意の組織のディレクトリ内のアカウントと、個人用の Microsoft アカウントオプションでアプリを登録した場合は、
common
という単語。 - 個人用 Microsoft アカウント オプションでアプリを登録した場合は、
consumers
という単語。
{enter-your-client-id-here}
という文字列を見つけて、既存の値をアプリケーション ID または Azure portal からコピーしたjava-servlet-webapp-call-graph
アプリケーションのclientId
に変更します。{enter-your-client-secret-here}
という文字列を見つけて、既存の値を、Azure portal でjava-servlet-webapp-call-graph
アプリを作成するときに保存した値に置き換えます。
サンプルをビルドする
Maven を使用してサンプルをビルドするには、サンプルの pom.xml ファイルが含まれているディレクトリに移動して、次のコマンドを実行します。
mvn clean package
このコマンドを実行すると、.war ファイルが作成されます。これはさまざまなアプリケーション サーバーで実行できます。
サンプルを実行する
以降の手順では、WebSphere をインストールし、サーバーが設定されていることを前提としています。 サーバーのセットアップの基本について、「Azure 仮想マシンで (従来の) WebSphere Application Server クラスターをデプロイする」のガイダンスを参照してください。
WebSphere にデプロイする前に、次の手順を使用してサンプル本体の構成を変更してから、パッケージをビルドまたはリビルドする必要があります。
アプリの authentication.properties ファイルに移動し、
app.homePage
の値を、使用を計画しているサーバーの URL とポート番号に変更します (次の例を参照)。# app.homePage is by default set to dev server address and app context path on the server # for apps deployed to azure, use https://your-sub-domain.azurewebsites.net app.homePage=https://<server-url>:<port-number>/msal4j-servlet-auth/
このファイルを保存した後、次のコマンドを使用してアプリをリビルドします。
mvn clean package
コードのビルドが終了したら、.war ファイルをターゲット サーバーのファイル システムにコピーします。
また、Azure アプリの登録でも同じ変更を行う必要があります。Azure portal で、認証タブのリダイレクト URI の値に対し、これを設定してください。
開発者用の Microsoft ID プラットフォームの [アプリの登録] ページに移動します。
検索ボックスを使用してアプリの登録を検索します (例:
java-servlet-webapp-authentication
)。名前を選択して、アプリの登録を開きます。
コマンドメニューから 認証 を選択します。
Web - リダイレクト URI セクションで、URI の追加を選択します。
アプリの URI を、/auth/redirect を追加して入力します (例:
https://<server-url>:<port-number>/auth/redirect
)。[保存] を選択します。
WebSphere の Integrated Solutions Console を使用してサンプルをデプロイするには、次の手順に従います。
アプリケーション タブで、新しいアプリケーションを選択し、新しいエンタープライズ アプリケーションを選択します。
ビルドした .war ファイルを選択し、Web モジュールのマップ コンテキスト ルートのインストール手順が表示されるまで次へを選択します。 その他の既定の設定はそのままで問題ありません。
コンテキスト ルートの場合は、サンプル構成/Azure アプリの登録で設定した 'リダイレクト URI' のポート番号の後と同じ値に設定します。 つまり、リダイレクト URI が
http://<server-url>:9080/msal4j-servlet-auth/
である場合、コンテキスト ルートはmsal4j-servlet-auth
になります。完了 を選択します。
アプリケーションのインストールが完了したら、アプリケーションタブの WebSphere エンタープライズ アプリケーション セクションに移動します。
アプリケーションの一覧からインストールした .war ファイルを選択し、開始を選択してデプロイします。
デプロイが完了したら、
http://<server-url>:9080/{whatever you set as the context root}
に移動します。アプリケーションが表示されます。
サンプルの確認
次の手順に従ってサンプルを操作します。
- サインインまたはサインアウトの状態が、画面の中央に表示されます。
- 画面の隅にある状況依存ボタンを選択します。 このボタンは、アプリを最初に実行するときにサインインと表示します。
- 次のページに記載された指示に従い、Microsoft Entra ID テナントのアカウントでサインインします。
- 同意画面に、必要となるスコープが表示されます。
- 状況依存ボタンの表示がサインアウトに変わり、ユーザー名が表示されます。
- ID トークンの詳細を選択すると、ID トークンのデコードされた要求の一部が表示されます。
- Graph を呼び出すを選択して Microsoft Graph の /me エンドポイント を呼び出し、取得したユーザーの詳細の選択を確認します。
- 画面隅のボタンを使用してサインアウトします。
コードについて
このサンプルでは、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 ファイルも必要です。 これらのクラスとファイルには、さまざまなアプリケーションで使用できる汎用コードが含まれています。 サンプルの残りもコピーできますが、他のクラスとファイルは、このサンプルの目的に合わせて特別にビルドされたものです。
Contents
次の表に、サンプル プロジェクト フォルダーの内容を示します。
ファイル/フォルダー | 説明 |
---|---|
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 ファイルから読み取られます。
ステップバイステップのチュートリアル
次の手順で、アプリの機能をチュートリアルで紹介します。
サインイン プロセスの最初のステップでは、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
など、その他のスコープを追加できます。
- 通常、ID トークンの応答を受信するには、
Microsoft Entra ID により、ユーザーにサインイン プロンプトが表示されます。 サインインが成功すると、ユーザーのブラウザーはアプリのリダイレクト エンドポイントにリダイレクトされます。 このエンドポイントへの有効な要求には、、認証コードが含まれています。
その後、この承認コードは、
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
: 前のステップで使用したスコープを、再度渡す必要があります。
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
が必要です。
詳細
- Java 用 Microsoft 認証ライブラリ (MSAL)
- Microsoft IDプラットフォーム (開発者向け Microsoft Entra ID)
- クイック スタート: Microsoft ID プラットフォームにアプリケーションを登録する
- Microsoft Entra ID アプリケーションの同意エクスペリエンスについて理解する
- ユーザーおよび管理者の同意について
- MSAL コードのサンプル
次のステップ
Azure Virtual Machines にある従来の WebSphere に Java WebSphere アプリをデプロイする