Events

バージョン 2.4 以降の Msal-Browser (@azure/msal-browser) では、コア ライブラリとラッパー ライブラリのユーザーが使用できるイベント API が提供されるようになりました。 これらのイベントは認証と MSAL の処理に関連しており、アプリケーションで UI の更新やエラー メッセージの表示などを行うために使用できます。

イベントの外観

export type EventMessage = {
    eventType: EventType;
    interactionType: InteractionType | null;
    payload: EventPayload;
    error: EventError;
    timestamp: number;
};

EventMessageのペイロードとエラーは次のように定義されます。

export type EventPayload = PopupRequest | RedirectRequest | SilentRequest | SsoSilentRequest | EndSessionRequest | AuthenticationResult | PopupEvent | null;

export type EventError = AuthError | Error | null;

msal-browser でのイベントの生成方法

Msal-browser には、保護された関数 emitEventがあり、主要な API でイベントを出力します。 現在出力されているイベントの一覧については、次の表を参照してください。

msal-browser がペイロードまたはエラーを含むイベントを生成する方法の例を次に示します。

this.emitEvent(EventType.LOGIN_SUCCESS, InteractionType.Redirect, result);

this.emitEvent(EventType.LOGIN_FAILURE, InteractionType.Redirect, null, e);

イベント API の使用方法

Msal-browser は、コールバック関数を受け取る addEventCallback 関数をエクスポートし、出力されたイベントを処理するために使用できます。

アプリケーションで生成されたイベントを使用する方法の例を次に示します。

const callbackId = msalInstance.addEventCallback((message: EventMessage) => {
    // Update UI or interact with EventMessage here
    if (message.eventType === EventType.LOGIN_SUCCESS) {
        console.log(message.payload);
     }
});

イベント コールバックを追加すると、ID が返されます。この ID は、msal-browser によってエクスポートされた removeEventCallback 関数を使用して、必要に応じてコールバックを削除するために使用できます。

msalInstance.removeEventCallback(callbackId);

エラーの処理

EventErrorの定義方法により、イベントで生成されたエラーを処理するには、出力されたエラーの特定のプロパティにアクセスする前に、エラーが正しい型であることを検証する必要があります。 エラーは、 AuthError にキャストすることも、 AuthErrorのインスタンスであることを確認することもできます。

出力されたイベントを使用してエラーをキャストする例を次に示します。

const callbackId = msalInstance.addEventCallback((message: EventMessage) => {
    // Update UI or interact with EventMessage here
    if (message.eventType === EventType.LOGIN_FAILURE) {
        if (message.error instanceof AuthError) {
            // Do something with the error
        }
     }
});

イベントからの対話状態の取得

getInteractionStatusFromEvent API を使用して、イベントから現在の対話状態を取得できます。

進行中の対話がない場合にメッセージを表示する例を次に示します。

const callbackId = msalInstance.addEventCallback((message: EventMessage) => {
    const status = EventMessageUtils.getInteractionStatusFromEvent(message);

    // Update UI or interact with EventMessage here
    if (status === InteractionStatus.None) {
        console.log(message.payload);
    }
});

タブとウィンドウ間でログに記録された状態を同期する

ユーザーがアプリにログインまたはログアウトするとき、または別のタブまたはウィンドウでアクティブなアカウントを変更するときに UI を更新する場合は、 LOGIN_SUCCESSLOGOUT_SUCCESS、および ACTIVE_ACCOUNT_CHANGED イベントをサブスクライブできます。

  • アカウントの追加と削除の場合、ペイロードは追加または削除された AccountInfo オブジェクトになります。
  • アクティブなアカウントの更新の場合、ペイロードはありません
msalInstance.addEventCallback((message: EventMessage) => {
    if (message.eventType === EventType.LOGIN_SUCCESS) {
        // Update UI with new account
    } else if (message.eventType === EventType.LOGOUT_SUCCESS) {
        // Update UI with account logged out
    } else if (message.eventType === EventType.ACTIVE_ACCOUNT_CHANGED) {
        const accountInfo = msalInstance.getActiveAccount();
        // Update UI with new active account info
    }
});

イベントの表

これらは、msal-browser によって現在生成されているイベントです。

イベントの種類 説明 相互作用の種類 ペイロード エラー
LOGIN_START LoginPopup または loginRedirect が呼び出される Popup または Redirect PopupRequest または RedirectRequest
LOGIN_SUCCESS 正常にログインしました Popup または Redirect AccountInfo
LOGIN_FAILURE ログイン時のエラー Popup または Redirect AuthError またはエラー
ACQUIRE_TOKEN_START AcquireTokenPopup または acquireTokenRedirect または acquireTokenSilent が呼び出される Popup または Redirect または Silent PopupRequest または RedirectRequest または SilentRequest
ACQUIRE_TOKEN_SUCCESS キャッシュまたはネットワークからトークンを正常に取得しました Popup または Redirect または Silent AuthenticationResult
ACQUIRE_TOKEN_FAILURE トークンを取得するときのエラー Popup または Redirect または Silent AuthError またはエラー
ACQUIRE_TOKEN_NETWORK_START ネットワークからのトークンの取得の開始 Silent
SSO_SILENT_START SsoSilent API の呼び出し Silent SsoSilentRequest
SSO_SILENT_SUCCESS SsoSilent succeeded Silent AuthenticationResult
SSO_SILENT_FAILURE SsoSilent failed Silent AuthError またはエラー
HANDLE_REDIRECT_START HandleRedirectPromise の呼び出し Redirect
HANDLE_REDIRECT_END HandleRedirectPromise が完了しました Redirect
LOGOUT_START 呼び出されたログアウト Redirect または Popup EndSessionRequest または EndSessionPopupRequest
LOGOUT_END ログアウトが完了しました Redirect または Popup
LOGOUT_SUCCESS ログアウトの成功 Redirect または Popup EndSessionRequest または EndSessionPopupRequest
LOGOUT_FAILURE ログアウトに失敗しました Redirect または Popup AuthError またはエラー
ACTIVE_ACCOUNT_CHANGED 別のタブまたはウィンドウで変更されたアクティブなアカウント フィルター N/a N/a N/a
INITIALIZE_START 呼び出された初期化関数 N/a N/a N/a
INITIALIZE_END 関数の初期化が完了しました N/a N/a N/a