MSAL Browser v4 から v5 への移行

MSAL を初めて使用する場合は、 ここから始める必要があります。

MSAL v2 から来ている場合は、最初に このガイド を確認して MSAL v3 に移行する必要があります。 MSAL v3 から来ている場合は、最初に このガイド を確認して MSAL v4 に移行してから、次の手順に従う必要があります。

MSAL v4 から来ている場合は、このガイドに従って、MSAL v5 を使用するようにコードを更新できます。

API の破壊的変更

SignedHttpRequest.removeKeys 戻り値の型が変更されました

removeKeys クラスのSignedHttpRequest関数は、Promise<void>ではなくPromise<boolean>を返すようになりました。 Promise 正常な解決は、以前の true の戻り値に相当するようになりました。 エラーが発生した場合、false を返す代わりにエラーとしてスローされるようになりました。

// BEFORE
const shr = new SignedHttpRequest(shrParameters, shrOptions);
const result = await shr.removeKeys(thumbprint);
if (result) {
    // do something on success
} else {
    // do something on failure
}

// AFTER
const shr = new SignedHttpRequest(shrParameters, shrOptions);
await shr
    .removeKeys(thumbprint)
    .then(() => {
        // do something on success
    })
    .catch((e) => {
        // do something on failure
        console.log(e);
    });

TokenCache と loadExternalTokens

loadExternalTokens の MSAL JS API が変更されました。 それらの変更を次に示します。

  • TokenCache オブジェクトと getTokenCache() が削除されました
  • loadExternalTokens() API は別のエクスポートになり、パラメーターとしてConfigurationが必要になりました
// BEFORE

const pca = new PublicClientApplication(config);
await pca
    .getTokenCache()
    .loadExternalTokens(silentRequest, serverResponse, loadTokenOptions);

//AFTER

await loadExternalTokens(
    config,
    silentRequest,
    serverResponse,
    loadTokenOptions
);

handleRedirectPromise API シグネチャが変更されました

以前は、 PublicClientApplication.handleRedirectPromise 省略可能なハッシュ パラメーターを使用しました。 HandleRedirectPromiseOptionsと呼ばれる新しいオプションの種類が導入されました。 MSAL Browser v5 の時点では、 HandleRedirectPromiseOptions 型の省略可能なオブジェクトが、 handleRedirectPromise() 受け入れる唯一のパラメーターです。

// BEFORE
const hash = window.location.hash; // Arbitrary example value
pca.handleRedirectPromise(hash);

// AFTER
pca.handleRedirectPromise({
    hash: window.location.hash, // Option nested inside a `HandleRedirectPromiseOptions` object
    navigateToLoginRequestUrl: true, // Additional option
});

PublicClientApplication の一部の機能の削除

PublicClientApplicationの次の関数は削除されました。

  1. enableAccountStorageEvents()disableAccountStorageEvents(): アカウント ストレージ イベントが常に有効になりました。 これらの関数呼び出しは必要なくなりました。

  2. getAccountByHomeId()getAccountByLocalId()getAccountByUsername(): 代わりに getAccount() を使用します。

    // BEFORE
    const account1 = accountManager.getAccountByHomeId(yourHomeAccountId);
    const account2 = accountManager.getAccountByLocalId(yourLocalAccountId);
    const account3 = accountManager.getAccountByUsername(yourUsername);
    
    // AFTER
    const account1 = accountManager.getAccount({
        homeAccountId: yourHomeAccountId,
    });
    const account2 = accountManager.getAccount({
        localAccountId: yourLocalAccountId,
    });
    const account3 = accountManager.getAccount({ username: yourUsername });
    
  3. logout(): 代わりに logoutRedirect() または logoutPopup() を使用します。

startPerformanceMeasurement() の削除

startPerformanceMeasurement() は削除されました。 代わりに、startMeasurement() を使用してください。

PublicClientNext の削除

PublicClientNext クラスとその静的メソッドcreatePublicClientApplication()は、MSAL v5 で削除されました。 アプリケーションの要件に応じて、次のいずれかの代替手段を使用する必要があります。

  • PublicClientApplication: これは、標準のシングルアプリ シナリオに使用します。 これが既定で最も一般的な使用方法です。
  • createNestablePublicClientApplication: 入れ子になったアプリ (NAA) をサポートする必要がある場合に使用します。 入れ子になったアプリ ブリッジが使用できない場合、または入れ子になったアプリ認証をサポートするようにハブが構成されていない場合、この関数は自動的に標準の PublicClientApplication にフォールバックします。 詳細については、入れ子になったアプリの構成を参照してください。
  • createStandardPublicClientApplication: これを使用して、標準 (NAA 以外) の PublicClientApplication インスタンスをインスタンス化して初期化します。

移行の例

// BEFORE (using PublicClientNext)
import { PublicClientNext } from "@azure/msal-browser";

const pca = PublicClientNext.createPublicClientApplication(config);
// AFTER (standard usage)
import { PublicClientApplication } from "@azure/msal-browser";

const pca = new PublicClientApplication(config);
await pca.initialize();
// AFTER (nested app support)
import { createNestablePublicClientApplication } from "@azure/msal-browser";

const pca = await createNestablePublicClientApplication(config);
// AFTER (standard)
import { createStandardPublicClientApplication } from "@azure/msal-browser";

const pca = await createStandardPublicClientApplication(config);

ほとんどのアプリケーションでは、 PublicClientNext.createPublicClientApplication(config)new PublicClientApplication(config) に置き換える必要があります。 以前に supportsNestedAppAuth 構成オプションを使用していた場合は、代わりに createNestablePublicClientApplication(config) に移行します。

PublicClientApplication.createPublicClientApplication 静的関数の削除

createPublicClientApplicationPublicClientApplication静的関数は削除され、個別にエクスポートされたcreateStandardPublicClientApplicationに置き換えられました。

移行の例

// BEFORE
import { PublicClientApplication } from "@azure/msal-browser";

const pca = await PublicClientApplication.createPublicClientApplication(config);
// AFTER
import { createStandardPublicClientApplication } from "@azure/msal-browser";

const pca = await createStandardPublicClientApplication(config);

構成の変更

BrowserAuthOptions の変更

  1. skipAuthorityMetadataCache パラメーターが Configuration の BrowserAuthOptions から削除されました。

  2. protocolMode パラメーターは、Configuration の BrowserAuthOptions ではなく SystemOptions に移動されました。

  3. supportsNestedAppAuth パラメーターは削除されました。 入れ子になったアプリの createNestablePublicClientApplication API を代わりに使用します。 入れ子になったアプリの詳細 については、こちらをご覧ください

  4. navigateTologinRequestUrl パラメーターは Configuration の BrowserAuthOptions から削除されました。代わりに、handleRedirectPromiseの呼び出しのパラメーターとして options オブジェクト内で指定できるようになりました。

    pca.handleRedirectPromise({ navigateToLoginRequestUrl: false });
    
  5. encodeExtraQueryParams パラメーターは削除されました。 追加のクエリ パラメーターはすべてエンコードされます。

  6. supportsNestedAppAuth パラメーターは削除されました。 createNestablePublicClientApplication() を代わりに使用します。

        // BEFORE
        const pca = new PublicClientApplication({
            auth: {
                clientId: "your-client-id",
                authority: "https://login.microsoftonline.com/common"
                supportsNestedAppAuth: true
            },
        });
    
        // AFTER
        const pca = await createNestablePublicClientApplication({
            auth: {
                clientId: "your-client-id",
                authority: "https://login.microsoftonline.com/common"
            }
        });
    
  7. OIDCOptions パラメーターは、ResponseModeではなくServerResponseTypeを受け取るようになりました。 ResponseMode.QUERYではなく、ServerResponseType.QUERYResponseMode.FRAGMENTの代わりにServerResponseType.FRAGMENTを使用してください。

CacheOptions の変更

次のパラメーターは MSAL Browser v4 で非推奨となり、v5 の CacheOptions から削除されました。

  1. temporaryCacheLocation
  2. claimsBasedCachingEnabled - アクセス トークンは、要求された要求に基づいて格納されなくなりました。
  3. storeAuthStateInCookie
  4. secureCookies - すべての Cookie が HTTPS 経由でのみ安全に送信されるようになりました。
  5. cacheMigrationEnabled

システム オプション

  1. protocolMode パラメーターは、Configuration のSystemOptionsからBrowserAuthOptionsに移動されました。 オプションや機能に変更はありません。
  2. navigateFrameWait パラメーターは削除されました。 これは以前、MSAL.jsでサポートされなくなった古いブラウザーで必要とされていました。
  3. iframeHashTimeoutパラメーターと windowHashTimeout パラメーターは、それぞれ iframeBridgeTimeout および popupBridgeTimeout に置き換えられました。 これらのタイムアウトは、BroadcastChannel API 経由でリダイレクト ブリッジからの応答を待機する時間を制御するようになりました。

asyncPopups

asyncPopups パラメーターの名前が navigatePopupsSystemOptions に変更され、オプションが逆になります。 ポップアップを開いて後で移動するかどうかを設定します。 true に設定すると、空白のポップアップが開き、ログイン ドメインに移動します。 false に設定すると、ポップアップがログイン ドメインに直接開かれます。 これは、デスクトップ アプリやプログレッシブ Web アプリなど、 about:blank がサポートされていないシナリオでは false に設定できます。

Important

既定では、 navigatePopupstrue に設定されます。 以前 asyncPopups を使用していた場合は、 navigatePopups に変更し、構成を元に戻す必要があります。

詳細については、 構成に関するドキュメント を参照してください。

要求時の変更

onRedirectNavigate パラメーターの削除

onRedirectNavigate パラメーターは、今後の オブジェクトConfigurationRedirectRequestおよびEndSessionRequest オブジェクトから削除されます。 使用する必要がある場合は、msal 構成で設定してください。

追加の要求パラメーターの統合

次の要求パラメーターが削除されました。

  • authorizePostBodyParams
  • tokenBodyParameters
  • tokenQueryParameters

追加の要求パラメーターを簡略化するには、新しい extraParameters 要求オプションで汎用の追加パラメーターを使用する必要があります。 リクエストで extraParameters が設定されている場合、それらは、リクエストで構成されている httpMethod(既定値は GET)に応じて、URL のクエリ文字列またはリクエスト本文内のすべてのトークンサービス呼び出しで送信されます。 URL クエリ文字列に含まれている必要がある追加のパラメーターを送信するには、 extraQueryParameters 引き続き使用できます。

Note

追加のパラメーターを extraQueryStringParameters にするか、 extraParametersに入れるのかわからない場合は、 extraParametersに入る可能性が最も高くなります。

v4(以前の)リクエストの例:

// Example of a GET request with extra parameters
const authRequest = {
    scopes: ["SAMPLE_SCOPE"],
    extraQueryParamters: {
        "dc": "DC_VALUE" // This was sent on the query string on GET /authorize
    },
    tokenBodyParameters: {
        "extra_parameters_assertion": "ASSERTION_VALUE" // This was sent on the POST body to /token
    },
    tokenQueryParamters: {
        "slice": "SLICE_VALUE" // This was sent on the query string on POST /token
    }
}

// Example of a POST request with extra parameters
const authRequest = {
    scopes: ["SAMPLE_SCOPE"],
    httpMethod: "POST", // default is "GET" -> Determines method for "/authorize" call. Calls to "/token" are always POST
    extraQueryParamters: {
        "dc": "DC_VALUE" // This was sent on the query string on POST /authorize
    },
    authorizePostBodyParameters: {
        "extra_parameters_assertion": "ASSERTION_VALUE", // This was sent on the body on POST /authorize
    }
    tokenBodyParameters: {
        "extra_parameters_assertion": "ASSERTION_VALUE" // This was sent on the POST body to /token
    },
    tokenQueryParamters: {
        "slice": "SLICE_VALUE" // This was sent on the query string on POST /token
    }
}

v5 リクエストの例

// Example of a GET request with extra parameters
const authRequest = {
    scopes: ["SAMPLE_SCOPE"],
    extraQueryParamters: {
        // Will be sent in query string to /authorize and /token
        "dc": "DC_VALUE",
        "slice": "SLICE_VALUE"
    },
    extraParameters: {
        "extra_parameters_assertion": "ASSERTION_VALUE", // Will be sent in query string to /authorize and in body to /token
    },
};

// Example of a POST request with extra parameters
const authRequest = {
    scopes: ["SAMPLE_SCOPE"],
    httpMethod: "POST", // default is "GET" -> Determines method for "/authorize" call. Calls to "/token" are always POST
    extraQueryParamters: {
        // Will be sent in query string to /authorize and /token
        "dc": "DC_VALUE",
        "slice": "SLICE_VALUE"
    },
    extraParameters: {
        extra_parameter_assertion: "assertion_value", // Will be sent in post body to /authorize and /token
    },
};

Note

MSAL によって、 extraParameters を URL 文字列にエンコードする必要があると判断された場合、 extraParameters は同じ名前のパラメーターを上書きする方法で extraQueryParams とマージされます。 このような場合、 extraParameters のパラメーターの値は、 extraQueryParamsの値よりも優先されます。

Cross-Origin-Opener-Policy (COOP) 対応

MSAL Browser v5 には、クロスオリジンOpener-Policy (COOP) の組み込みサポートが導入されています。これにより、参照コンテキストを分離することでセキュリティが強化されます。 認証サービス (Microsoft Entra IDまたは Azure AD B2C) が COOP ヘッダーを返すと、従来のポップアップおよびサイレント iframe 認証フローが制限されます。 MSAL v5 には、COOP 対応環境での認証を処理するためのリダイレクト ブリッジ メカニズムが用意されています。

Note

Microsoft Entra ID (以前のAzure AD) では、COOP が既定で有効になっています。 Azure AD B2C の場合、COOP の可用性は、バックエンド構成と使用されている認証エンドポイントによって異なります。

変更された内容

認証サービスの応答 ( Cross-Origin-Opener-Policy: same-origin など) に COOP ヘッダーが存在する場合、認証ウィンドウがメイン アプリケーション ウィンドウと通信できないため、従来のポップアップおよびサイレント iframe 認証フローは失敗します。 MSAL v5 は、リダイレクト ブリッジ パターンを導入することでこれを解決します。

すべての認証フロー (acquireTokenSilent()ssoSilent()loginPopup()loginRedirect()) でリダイレクト ブリッジが使用されるようになりました。 リダイレクト ブリッジは、フローに基づいて認証応答を異なる方法で処理します。

  • ポップアップ フローとサイレント フロー: リダイレクト ブリッジは、BroadcastChannel API を使用してメイン アプリケーション ウィンドウに認証応答をブロードキャストします
  • リダイレクト フロー: リダイレクト ブリッジは、URL の認証応答を使用してリダイレクトを開始したアプリケーションのページに戻ります

しくみ

  1. メイン アプリケーション: アプリケーションは、loginPopup()ssoSilent()、または loginRedirect() を使用して認証を開始します
  2. リダイレクト: MSAL は、機関ページへのポップアップ/iframe/ウィンドウを開きます
  3. 認証フロー: 機関ページが OAuth フローを完了し、認証応答を受け取ります
  4. 応答処理: リダイレクト ページでは、次の新しい broadcastResponseToMainFrame() 関数が使用されます。
    • ポップアップ/サイレント フローの場合: BroadcastChannel API を使用してメイン ウィンドウに応答をブロードキャストします
    • リダイレクト フローの場合: 認証応答でacquireTokenRedirectが開始されたページに移動します
  5. トークンの取得: メイン アプリケーションが応答を受け取り、トークンの取得を完了します

移行の手順

1. リダイレクト ブリッジ ページを設定する

broadcastResponseToMainFrame()から@azure/msal-browser/redirect-bridgeを呼び出すページを作成します。 このページは COOP ヘッダーと共に提供 しないでください

セットアップはビルド システムによって異なります。 リダイレクト ブリッジのセットアップ ガイド Framework-Specific 参照してください。

フレームワーク Approach
角度 ルート コンポーネント + 省略可能な angular.json アセット
Vite 複数ページ rollupOptions.input
Webpack 別個のエントリ + HtmlWebpackPlugin
Next.js MsalProvider から除外されるページコンポーネント
CRA (React アプリの作成) 静的 public/redirect.html ページ
Express.js サーバー側 COOP ヘッダーの除外

リダイレクト URI に関する考慮事項 | | 」も参照してください

2. MSAL 構成を更新する

redirectUriを新しいリダイレクト ブリッジ ページにポイントします。

const msalConfig = {
    auth: {
        clientId: "{your-client-id}",
        authority: "https://login.microsoftonline.com/common",
        redirectUri: "https://{your-app-home-page}/redirect",
    },
};

Important

また、Entra ID アプリの登録でリダイレクト URI を更新する必要があります。 URI は、パス、プロトコル、ポートなど、 正確に 一致する必要があります。 これを行わないと、 redirect_uri_mismatch エラーが発生します。

動作の破壊的変更

イベントの種類と InteractionStatus の変更

イベントの種類と InteractionStatus を統合し、発生した API ではなく、何が起こったかを反映しました。

  1. SSO_SILENT および ACQUIRE_TOKEN_BY_CODE イベントは、 ACQUIRE_TOKEN イベント (START/SUCCESS/FAILURE バリアント) に置き換えられました
  2. ACCOUNT_ADDED ACCOUNT_REMOVEDは、それぞれLOGIN_SUCCESSLOGOUT_SUCCESSに置き換えられました。
  3. LOGIN_START LOGIN_FAILUREは、それぞれACQUIRE_TOKEN_STARTACQUIRE_TOKEN_FAILUREに置き換えられました。
  4. LOGIN_SUCCESSのペイロードがAccountInfo オブジェクトになりました。
  5. ログインが成功すると、 LOGIN_SUCCESS イベントと ACQUIRE_TOKEN_SUCCESS イベントの両方が出力されるようになりました。

LOGIN_SUCCESS ペイロードの種類の移行

イベント コールバックで現在 LOGIN_SUCCESS ペイロードを AuthenticationResult にキャストしている場合は、LOGIN_SUCCESS には AccountInfo を使用するように更新し、ACQUIRE_TOKEN_SUCCESS には AuthenticationResult を使用してください。

// BEFORE (v4-style assumption)
import {
    EventType,
    AuthenticationResult,
} from "@azure/msal-browser";

pca.addEventCallback((event) => {
    if (event.eventType === EventType.LOGIN_SUCCESS) {
        const result = event.payload as AuthenticationResult;
        setAccount(result.account); // Will silently fail in v5 where payload is AccountInfo, not AuthenticationResult
    }
});
// AFTER (v5-safe handling)
import {
    EventType,
    AuthenticationResult,
    AccountInfo,
} from "@azure/msal-browser";

pca.addEventCallback((event) => {
    if (event.eventType === EventType.LOGIN_SUCCESS) {
        const account = event.payload as AccountInfo;
        setAccount(account);
    }

    if (event.eventType === EventType.ACQUIRE_TOKEN_SUCCESS) {
        const result = event.payload as AuthenticationResult;
        setAccessToken(result.accessToken);
    }
});

エラー メッセージ形式の変更

バンドル サイズを小さくするために、エラー メッセージがバンドルから移動されました。 エラーがスローされると、 message プロパティは、説明的なエラー メッセージではなく、エラー ドキュメントへの汎用リンクを返すようになりました。

// BEFORE (v4)
error.message = "Token request cannot be made without authorization code or refresh token.";

// AFTER (v5)
error.message = "See https://aka.ms/msal.js.errors#request_cannot_be_made for details";

errorCode プロパティは変更されず、特定のエラーを識別するために引き続き使用できます。 エラーの詳細な説明については、 エラーのドキュメントを参照してください

Important

アプリケーションが error.message プロパティの解析または表示に依存している場合は、代わりに errorCode を使用するようにエラー処理コードを更新するか、ユーザーをドキュメント リンクに誘導する必要があります。

エラー処理コードの更新

ユーザーにエラーを表示する場合は、errorCodeを直接表示するのではなく、error.messageをわかりやすいメッセージにマップします。

// BEFORE (v4)
showError(error.message);

// AFTER (v5) — use errorCode for user-facing messages
const userMessages = {
    request_cannot_be_made: "Please sign in again to continue.",
    interaction_required: "Additional verification is needed.",
    consent_required: "Administrator approval is required for this action.",
    login_required: "Your session has expired. Please sign in again.",
    // Add mappings for error codes your application encounters
};
showError(userMessages[error.errorCode] || "An authentication error occurred.");

条件付きロジックのエラーを解析する場合は、 message の文字列一致から errorCode の比較に切り替えます (これは v4 で既に推奨されているアプローチでした)。

// BEFORE (v4) — fragile, relied on message text
if (error.message.includes("interaction_required")) {
    await msalInstance.acquireTokenPopup(request);
}

// AFTER (v5) — use errorCode (stable across versions)
if (error.errorCode === "interaction_required") {
    await msalInstance.acquireTokenPopup(request);
}

診断のエラーをログに記録する場合は、 errorCodemessage の両方を含めます (メッセージには関連するドキュメントへの直接リンクが含まれるようになりました)。

// AFTER (v5) — log errorCode for programmatic use, message for the docs link
logger.error(`MSAL Error [${error.errorCode}]: ${error.message}`);
// Output: MSAL Error [request_cannot_be_made]: See https://aka.ms/msal.js.errors#request_cannot_be_made for details

Tip

errorCodeの値は v4 と v5 の間で同じです。message形式のみが変更されています。 既存のコードが既に errorCodeで分岐している場合、変更は必要ありません。

コンソールログの変更

バンドル サイズを小さくするために、コンソール ログ メッセージがハッシュされるようになりました。 ブラウザー コンソールに完全なログ メッセージが表示されるのではなく、ハッシュ値が表示されます。

// BEFORE (v4)
[Wed, 15 Jan 2025 10:30:45 GMT] : abc-123 : @azure/msal-browser@4.27.0 : Info - Returning token from cache

// AFTER (v5)
[Wed, 15 Jan 2025 10:30:45 GMT] : abc-123 : @azure/msal-browser@5.0.0 : Info - 7f3a9b2c

ブラウザー コンソールでのデバッグには、ログをデコードするための追加の手順が必要です。 ハッシュされたログを読み取り可能なメッセージにデコードするには、 デコード スクリプトを使用します。 デコード スクリプトの使用方法の詳細については、スクリプトの ドキュメントを参照してください