API 承認とトークン キャッシュについて

完了済み

ポータル サイトのデザインには、サインインしているユーザーのプロファイルをMicrosoft Graphから読み取る機能が含まれています。 認証はポータルに対するユーザーを識別しますが、API 呼び出しには適切なアクセス許可を持つアクセス トークンも必要です。

このユニットでは、アクセス許可の種類、スコープ、および MSAL4J トークン キャッシュ パターンの説明について説明します。 アプリケーションまたはサインイン セッションが実行されていることを前提としません。

API のアクセス許可とスコープ

保護された API は、その機能とデータに対するアクセス許可を定義します。 たとえば、Microsoft Graphには、プロファイルの読み取り、予定表の読み取り、メールの送信に関するさまざまなアクセス許可があります。 アプリケーションは、目的の操作に必要なアクセス許可のみを要求します。

Microsoft Entra IDでは、次の 2 つのアクセス許可の種類がサポートされています。

アクセス許可の種類 Context 同意
委任権限 アプリケーションは、サインインしているユーザーの代わりに動作します。 アクセスは、付与されたアクセス許可とユーザーのアクセスによって制限されます。 ユーザーまたは承認された管理者は、アクセス許可とテナント ポリシーに応じて同意を付与できます。
アプリケーションのアクセス許可 アプリケーションは、バックグラウンド サービスなど、サインインしているユーザーなしでそれ自体として機能します。 管理者の同意が必要です。

ポータルでは、委任されたアクセス許可User.Readを使用して、サインインしているユーザーのプロファイルを読み取ります。 このアクセス許可では、すべてのユーザーのデータや予定表などの関連のないリソースへのアクセス権は付与されません。

スコープは、要求されるアクセス権限を表します

委任された承認要求では、OAuth 2.0 スコープはアプリケーションが要求するアクセス許可を表します。 スコープは、リソースとアクセス許可の両方を識別できます。たとえば、https://graph.microsoft.com/Calendars.ReadはMicrosoft Graphの予定表読み取りアクセス許可を要求します。

この例では、単一のスコープ User.Readを使用します。 Microsoft Graphスコープの場合、リソース識別子を省略できるため、これはhttps://graph.microsoft.com/User.Readを表します。 詳細については、「 スコープとアクセス許可」を参照してください。

構成された API のアクセス許可、要求されたスコープ、および同意は異なります。 API アクセス許可をアプリ登録に追加しても、それ自体が同意を与えたり、アプリケーションのコードによって要求されたスコープを変更したりすることはありません。

アクセス トークンは、その API に固有です

アクセス トークンは、特定のリソースを対象としています。 Microsoft Graphのトークンは、別の API のトークンと交換できません。ID トークンは API アクセス トークンの代わりではありません。

MSAL4J はトークンを取得してキャッシュします。 アプリケーションは、トークンを解析してサインインしたユーザーの ID に関する前提を立て、再利用可能な承認コードとして扱うのではなく、目的のリソースにトークンを使用します。

わかりやすいサイレント トークンの取得

後で要求する場合、Web アプリケーションは、別のサインイン操作を通じてユーザーを送信することなく、MSAL にトークンを要求できます。 次のフラグメントは、参照サンプルの AuthHelperから適合しています。 セッションに関連付けられたキャッシュを復元し、そのコンテキストで既に表されているアカウントのトークンを要求する方法を示します。

final SilentParameters parameters = SilentParameters
                                        .builder(Collections.singleton(Config.SCOPES), context.getAccount())
                                        .build();

final ConfidentialClientApplication client = getConfidentialClientInstance();
client.tokenCache().deserialize(context.getTokenCache());

final IAuthenticationResult result = client.acquireTokenSilently(parameters).get();

SilentParameters は、要求されたスコープとアカウントを識別します。 このサンプルでは、 Config.SCOPES には User.Readが含まれており、 context は、認証されたセッションに関連付けられたアカウントとシリアル化されたキャッシュを提供します。 これらはサンプル アプリケーション ヘルパーであり、学習者が取得する必要がある値ではありません。

キャッシュが復元された後、 acquireTokenSilently はユーザーの操作なしで要求を満たそうとします。 使用可能なキャッシュされたアクセス トークンを返したり、必要に応じてキャッシュされた更新トークンを使用したりできます。 "サイレント" は、必ずしもネットワーク要求が発生しないことを意味するとは限りません。

このフラグメントは、周囲のキャッシュ永続化と例外処理を省略します。 MSAL がユーザーの操作が必要であることを示す場合、Web アプリケーションは新しい承認要求を開始し、結果のコールバックを処理します。 古い承認コードは再び使用されません。 ネットワーク エラーや構成エラーなどのその他のエラーには、無条件サインイン ループではなく、適切なエラー処理が必要です。

トークン キャッシュとセッション データには機密情報が含まれます。 完全なアプリケーションでは、そのデータを保護し、適切なアカウントとセッションに関連付け、キャッシュの変更を適切に保持する必要があります。

API 呼び出しの前に結果を解釈する

トークンの取得が成功すると、アクセス トークンとその有効期間とアカウント コンテキストに関する情報を含む IAuthenticationResult が生成されます。 Microsoft Graph要求の場合、アプリケーションは Graph アクセス トークンを HTTP クライアントまたは Graph 認証プロバイダーに提供します。

MSAL4J は、そのトークンを取得するだけでユーザーのプロファイルを読み取りません。 個別の API 要求によってデータ操作が実行されます。

Microsoft Graph はリソースを提供します

Microsoft Graph では、https://graph.microsoft.com を通じて Microsoft のクラウド データとサービスを公開します。 /v1.0/me エンドポイントはサインインしているユーザーを表し、委任されたユーザー コンテキストが必要です。

次のユニットでは、そのエンドポイントに対する説明的な要求と、Java Graph SDK を介した同等の要求を調べます。 Microsoft Graphの概要では、より広範な API について説明します。