Java Web アプリのサインイン フローをトレースする
このチュートリアルでは、説明用のJavaサーブレットコードを通して、サインイン要求をたどります。 ブラウザー、Microsoft Entra ID、MSAL4J、およびアプリケーションのセッション ヘルパーが対話する方法について説明します。
Note
これらのコード断片は、完全なアプリケーションでも、本番環境に対応した実装でもありません。 これらは、周囲のサーブレット・コード、インポート、構成、およびフローに焦点を当てるいくつかのエラー処理を省略します。 このユニットを完了するためにアプリケーションをビルドまたは実行する必要はありません。
アプリケーション定義ヘルパーを識別する
MSAL4J はトークン取得 API を提供します。 アプリケーションは、ブラウザーのリダイレクト、コールバック処理、セッションを調整する周囲のコードを提供します。 フラグメントでは、以下の説明用ヘルパー関数を使用します。
| ヘルパー | 例における役割 |
|---|---|
Config |
アプリケーション設定を提供します。
REDIRECT_URIは登録済みのコールバック URI を表し、SCOPESには単一のMicrosoft Graph スコープ User.Readが含まれています。 |
getConfidentialClientInstance と AuthHelper.getConfidentialClientInstance |
構成された ConfidentialClientApplicationを返します。 |
contextAdapter |
HTTP 要求と応答をアプリケーションのセッション コンテキストに接続します。 その redirectUser メソッドは、ブラウザーをリダイレクトします。 |
IdentityContextData と context |
nonce、トークン要求、認証結果、シリアル化されたトークン キャッシュなど、サインイン要求とセッションに関連付けられているデータを保持します。 |
これらの名前とそのヘルパー メソッドは、MSAL4J API ではなく、アプリケーション定義です。 これらの役割についてはチュートリアルで説明しますが、実装は含まれていません。
承認 URL がブラウザーの対話を開始する
最初のフラグメントは、アプリケーションが承認 URL を作成し、ブラウザーをリダイレクトする方法を示しています。 ヘルパーは、構成済みの機密クライアントを提供します。 また、アプリケーションは、このサインイン要求に対して新しく予測できない state 値と nonce 値を生成し、後で比較するために保持しました。
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 では、コールバック URI、要求されたスコープ、プロトコルのオプションについて説明します。
Collections.singleton 複数のスコープのスペース区切りリストではなく、 Config.SCOPES に 1 つのスコープが含まれているため、ここでは適切です。 MSAL では、既定で標準の OpenID Connect スコープ openid、 profile、および offline_access が追加されます。
MSAL4J 1.9.1 では、 ResponseMode.QUERY はコールバックのクエリ文字列に承認応答パラメーターを配置します。
Prompt.SELECT_ACCOUNT は、アカウントの選択を要求します。
state は応答をサインイン要求と関連付けるのに役立ちますが、 nonce はその要求に ID トークンをバインドします。
Note
MSAL4J 1.24.0 以降では、ResponseMode.QUERYは非推奨です。 この値を渡すと、 AuthorizationRequestUrlParameters.Builder.responseMode は ResponseMode.FORM_POST に置き換え、警告をログに記録します。 これはライブラリの動作の変更です。Microsoft Entraは引き続きプロトコル レベルでクエリ モード承認コード応答をサポートします。
フォームポスト応答の場合、サーブレットコールバックには、doGetのみに依存するのではなく、doPostなどの POST 対応の処理が必要です。 コールバック処理では、関連付けられているセッション、 state と nonce 検証、およびエラー処理を保持する必要があります。 応答モードの列挙型のみを変更しても、これらの責任には対処できません。
getAuthorizationRequestUrl は URL を構築します。 redirectUser は、ブラウザーをリダイレクトするアプリケーション定義ヘルパーです。 どちらの操作でも、認可コードの引き換えは行われません。
Important
図に示した要求には、サインイン時に委任された Microsoft Graph User.Read が含まれています。 同意プロンプトは、同意が必要な場合にのみ表示され、テナント ポリシーによってユーザーに許可されます。前のユーザーまたは管理者の同意は、プロンプトが表示されない可能性があります。
管理者の承認が必要なメッセージは、承認された管理者が組織の承認されたプロセスを通じて要求を確認する必要があることを示します。 適切な応答は、テナント全体の同意ポリシーを弱めることではありません。 ユーザー と管理者の同意を参照してください。
コールバックは、トークンのコードを交換します。
承認応答が成功した後、Microsoft Entra IDは認証コードを使用してブラウザーをアプリケーションのコールバック URI にリダイレクトします。 次のフラグメントは、コールバックが stateを検証し、エラー応答を処理し、 authCodeを抽出した後の引き換えに焦点を当てています。 コールバック実装全体は表示されません。
final AuthorizationCodeParameters authParams = AuthorizationCodeParameters
.builder(authCode, new URI(Config.REDIRECT_URI))
.scopes(Collections.singleton(Config.SCOPES))
.build();
final ConfidentialClientApplication client = AuthHelper.getConfidentialClientInstance();
final IAuthenticationResult result = client.acquireToken(authParams).get();
AuthorizationCodeParameters は、受信したコードをコールバック URI と要求されたスコープに接続します。 リダイレクト URI は、承認要求とアプリ登録で使用されたものと一致する必要があります。 機密クライアントは、トークン エンドポイントでコードを交換するときにアプリケーションを認証します。
acquireToken は将来を返し、 .get() はこの例の結果を待ちます。 引き換えが成功すると IAuthenticationResultが発生します。失敗した交換はエラーとして処理する必要があります。 承認コードは有効期間が短く、単一使用であり、後の API 呼び出しで再利用可能な資格情報ではありません。
Note
新しい実装の場合は、現在の承認コード フローガイダンスに従ってください。Microsoftは、機密 Web アプリを含むすべてのアプリケーションの種類に対して Proof Key for Code Exchange (PKCE) を推奨します。 PKCE はシングルページ アプリケーション (SPA) に必要ですが、ここに示す機密 Web アプリのプラットフォーム要件ではありません。
ここで示す明示的な MSAL4J URL 構築 API とコード引き換え API では、PKCE 入力は自動的に生成されません。 サインイン要求ごとに新しい予測不可能な検証ツールを生成し、一致するコールバック用に安全に保持します。 承認要求ビルダーで、S256 派生チャレンジを codeChallenge として指定し、 codeChallengeMethod("S256")を設定します。引き換えビルダーで、一致する codeVerifierを指定します。 PKCE は、クライアント認証や state と nonce 検証に代わることはありません。 上記のフラグメントでは、これらの PKCE 入力が省略されています。
アプリケーションが結果をセッションに関連付ける
次のフラグメントは、トークンの受信とセッションを認証済みとして扱う境界を示しています。 ここでは、 context はアプリケーション定義の IdentityContextData インスタンスです。
context.setIdTokenClaims(result.idToken());
validateNonce(context);
context.setAuthResult(result, client.tokenCache().serialize());
最初の呼び出しでは、ID トークンのクレームをアプリケーションの nonce 検証で利用できるようにします。 アプリケーション定義の validateNonce ヘルパーは、返された nonce を元の要求に保持されている値と比較し、検証が失敗した場合は処理を停止します。 最後の呼び出しでは、認証結果とシリアル化されたトークン キャッシュがアプリケーション コンテキストに記録されます。このキャッシュは、周囲のコードがセッションに関連付けられます。
これらのヘルパーは、アプリケーションの広範なセキュリティ責任を置き換えるわけではありません。 完全な実装には、正しい応答処理、セキュリティで保護されたセッションとトークン キャッシュストレージ、適切なエラー処理、保護された操作の承認も必要です。
フローを接続する
ブラウザーは、サインインを通じてユーザーを移動し、承認コードを返します。 サーバーはそのコードを MSAL4J で引き換え、結果を処理し、アプリケーションのセッションを維持します。 後でMicrosoft Graph呼び出しでは、承認コードや ID トークンではなく、アクセス トークンが使用されます。
ライブラリ API の詳細については、「MSAL4J 認証コード URL ビルダー」および「認証コードを使用したトークンの取得」を参照してください。