アクセス トークンの取得と使用

アクセス トークンを取得する前に、 アプリケーション オブジェクトを初期化する方法を理解しておく必要があります。 また、 アクセス トークンとリソースの関係を理解することも重要です。

MSAL では、ライブラリによって提供される acquireToken* メソッドを使用して、アプリが呼び出す必要がある API のアクセス トークンを取得できます。 acquireToken*メソッドは、OAuth 2.0 承認コード フローを使用したトークンの取得に関連する 2 つの手順を抽象化します。

  1. authorization code を取得するために Microsoft Entra ID に要求します。
  2. ユーザーが同意したスコープを含む アクセス トークン のコードを交換する

アクセス トークンの取得

相互作用の種類を選択する

acquireTokenRedirectの違いがわからない場合は、acquireTokenPopup参照してください。

要求オブジェクトを準備する

acquireToken* API に要求オブジェクトを渡す必要があります。 このオブジェクトを使用すると、要求で異なるパラメーターを使用できます。 要求オブジェクトのパラメーターの詳細については、 こちらを 参照してください。 スコープは、すべての acquireToken* 呼び出しに必要です。

キャッシュを確認する

MSAL は キャッシュ を使用して、スコープ、リソース、機関などの特定のパラメーターに基づいてトークンを格納し、必要に応じてキャッシュからトークンを取得します。 また、有効期限が切れたときに、それらのトークンのサイレント更新を実行することもできます。 MSAL は、 acquireTokenSilent メソッドを使用してこの機能を公開します。

ssoSilent API または login* API のいずれかを使用してログインすると、キャッシュには一連の ID、アクセス トークン、および更新トークンが含まれます。 アクセス トークンが必要になるたびに、 acquireTokenSilent を呼び出す必要があります。失敗した場合は、代わりに対話型 API を呼び出します。 acquireTokenSilent はキャッシュ内で有効なトークンを検索し、有効期限が近づいているか、存在しない場合は、キャッシュされた更新トークンを使用して自動的に更新を試みます。 詳細については、acquireTokenSilentこちらを参照してください

var request = {
    scopes: ["User.Read"],
};

msalInstance.acquireTokenSilent(request).then(tokenResponse => {
    // Do something with the tokenResponse
}).catch(async (error) => {
    if (error instanceof InteractionRequiredAuthError) {
        // fallback to interaction when silent call fails
        return msalInstance.acquireTokenPopup(request);
    }

    // handle other errors
})

リダイレクト

var request = {
    scopes: ["User.Read"],
};

msalInstance.acquireTokenSilent(request).then(tokenResponse => {
    // Do something with the tokenResponse
}).catch(error => {
    if (error instanceof InteractionRequiredAuthError) {
        // fallback to interaction when silent call fails
        return msalInstance.acquireTokenRedirect(request)
    }

    // handle other errors
});

アクセス トークンの使用

アクセス トークンを取得したら、次に示すように、トークンを取得したリソースへの要求のAuthorizationとして、 ヘッダーに含める必要があります。

var headers = new Headers();
var bearer = "Bearer " + tokenResponse.accessToken;
headers.append("Authorization", bearer);
var options = {
        method: "GET",
        headers: headers
};
var graphEndpoint = "https://graph.microsoft.com/v1.0/me";

fetch(graphEndpoint, options)
    .then(resp => {
        //do something with response
    });

MSAL トークン取得のベスト プラクティス

エラー、パフォーマンス ヒット、および使いやすさの問題を回避するために、MSAL でトークンを取得するためのベスト プラクティスを次に示します。 特定のシナリオでは、これらの例外が提供される場合があります。

1 つの PublicClientApplication インスタンスを使用する

アプリケーションごとに 1 つの PublicClientApplication をインスタンス化し、アプリ全体で同じインスタンスを使用します。 これにより、MSAL が常に実行している内容 ( MSAL イベントを参照) に関する信頼できるソースが 1 つ存在することが保証され、個別のアプリ オブジェクトが並列の対話型要求やキャッシュ競合を発生させる可能性がなくなり、アプリが中断されたり、パフォーマンスが低下したり、ユーザー エクスペリエンスが妨げられたりする可能性があります。

常に約束が解決されるのを待つ

すべての MSAL acquireToken*login* API は非同期操作を実行し、promise を返します。 ユーザー情報のレンダリング、保護された API の呼び出し、他の MSAL API の呼び出しなど、認証状態またはトークンに依存する他のタスクを実行する前に、これらの約束が解決されるまで常に待つ必要があります。

まずサイレント リクエストを試し、次に対話型リクエストを試します

トークンを要求するときは、常に最初に acquireTokenSilent を使用し、必要に応じて対話型トークンの取得にフォールバックします (たとえば、 InteractionRequiredAuthError がスローされたとき)。

複数のサイレント リクエストを同時に実行できます。 2 つ以上のサイレント要求が同時に行われると、(必要に応じて) 1 つの要求のみがネットワークに送信されますが、それらの要求が同じ要求パラメーター (スコープなど) に対するものである限り、すべてが応答を受け取ります。

同時対話型要求は許可 されません 。 2 つ以上の対話型要求が同時に行われると、最初の要求のみが対話を開始し、残りは エラー interaction_in_progress 失敗します。 このエラーと考えられる解決方法を理解して、アプリケーションでエラーが発生しないようにすることをお勧めします。

リソースごとに 1 つのトークン要求を行う

一度に 1 つのリソースに対してのみアクセス トークンを要求できます ( リソースとスコープを参照)。 必要に応じて、要求オブジェクトの extraScopesToConsent パラメーターを使用して、複数のリソースに必要なスコープ (アクセス許可) にユーザーの同意を求めることができます。 以前に同意したスコープのアクセス トークンは、サイレントで取得できます。

次のステップ