處理 MSAL.js 中的錯誤和例外狀況

本文概述了不同類型的錯誤,並提出處理常見登入錯誤的建議。

MSAL 錯誤處理基礎

Microsoft 驗證資源庫(MSAL)中的例外是為了讓應用程式開發者進行故障排除,而非顯示給最終使用者。 例外訊息並非本地化。

處理例外與錯誤時,您可以利用例外類型本身及錯誤代碼來區分例外。 有關錯誤代碼列表,請參閱 Microsoft Entra 認證與授權錯誤代碼。

在登入過程中,您可能會遇到關於同意、條件存取(MFA、裝置管理、基於位置的限制)、令牌發放與兌換,以及使用者屬性等錯誤。

以下章節將提供更多關於您應用程式錯誤處理的詳細資訊。

MSAL.js 中的錯誤處理

MSAL.js 提供錯誤物件,用以抽象並分類不同類型的常見錯誤。 它也提供介面,讓使用者能存取錯誤訊息等特定細節,以適當處理錯誤。

錯誤對象

export class AuthError extends Error {
    // This is a short code describing the error
    errorCode: string;
    // This is a descriptive string of the error,
    // and may also contain the mitigation strategy
    errorMessage: string;
    // Name of the error class
    this.name = "AuthError";
}

透過擴展錯誤類別,您可以取得以下特性:

  • AuthError.message:與 errorMessage相同。
  • AuthError.stack:已擲出的錯誤堆疊追蹤。

錯誤類型

以下錯誤類型可供選擇:

  • AuthError: MSAL.js 函式庫的基礎錯誤類別,也用於意外錯誤。

  • ClientAuthError: 錯誤類別,表示用戶端認證有問題。 大多數來自函式庫的錯誤都是 ClientAuthErrors。 這些錯誤會因為像是當登入正在進行時呼叫登入方法、使用者取消登入等原因造成的。

  • ClientConfigurationError:錯誤類別,擴充自 ClientAuthError,會在提出請求之前,於提供的使用者設定參數格式不正確或遺漏時拋出。

  • ServerError: 錯誤類別,代表認證伺服器傳送的錯誤字串。 這些錯誤可能是請求格式或參數無效,或任何其他阻礙伺服器驗證或授權使用者的錯誤。

  • InteractionRequiredAuthError: 錯誤類別,擴展 ServerError 為表示伺服器錯誤,這需要互動式呼叫。 當使用者需要與伺服器互動以提供憑證或同意驗證/授權時,會觸發 acquireTokenSilent 此錯誤。 錯誤代碼包括 "interaction_required"、 "login_required"、 "consent_required"和 。

在使用重定向方法(loginRedirect, ) acquireTokenRedirect的認證流程中處理錯誤時,你需要處理重定向承諾,該承諾在重定向後成功或失敗時會用 handleRedirectPromise() 以下方法呼叫:

const msal = require('@azure/msal-browser');
const myMSALObj = new msal.PublicClientApplication(msalConfig);

// Register Callbacks for redirect flow
myMSALObj.handleRedirectPromise()
    .then(function (response) {
        //success response
    })
    .catch((error) => {
        console.log(error);
    })
myMSALObj.acquireTokenRedirect(request);

彈出視窗經驗(loginPopup, acquireTokenPopup) 回傳承諾的方法,因此你可以使用承諾模式( 和.then.catch)來處理,如圖所示:

myMSALObj.acquireTokenPopup(request).then(
    function (response) {
        // success response
    }).catch(function (error) {
        console.log(error);
    });

需要使用者互動的錯誤

當你嘗試使用非互動式的方式取得代幣(如 acquireTokenSilent,但 MSAL 無法靜默執行)時,會回傳錯誤。

可能的原因包括:

  • 你需要登入
  • 你需要同意
  • 你需要經歷多重驗證的過程。

修復方法是呼叫一個互動式方法,例如 acquireTokenPopup 或 acquireTokenRedirect:

// Request for Access Token
myMSALObj.acquireTokenSilent(request).then(function (response) {
    // call API
}).catch( function (error) {
    // call acquireTokenPopup in case of acquireTokenSilent failure
    // due to interaction required
    if (error instanceof InteractionRequiredAuthError) {
        myMSALObj.acquireTokenPopup(request).then(
            function (response) {
                // call API
            }).catch(function (error) {
                console.log(error);
            });
    }
});

條件存取與理賠挑戰

當以靜默方式取得權杖時,如果您嘗試存取的 API 要求 條件式存取宣告挑戰(例如 MFA 原則),您的應用程式可能會收到錯誤。

處理此錯誤的模式是透過 MSAL 互動式取得令牌。 這會提示使用者,並給予他們機會滿足所需的條件存取政策。

在某些情況下,當呼叫需要條件存取的 API 時,你可能會在錯誤中收到 API 的理據挑戰。 例如,如果條件存取政策是要有受管理的裝置(Intune),錯誤會是像 AADSTS53000:你的裝置必須被管理才能存取此資源 或類似的訊息。 在這種情況下,你可以在取得權杖的呼叫中傳遞宣告,系統便會提示使用者滿足適當的原則。

當使用 MSAL.js 以無訊息方式取得權杖時(使用 acquireTokenSilent),如果您嘗試存取的 API 要求 條件式存取宣告質詢,例如 MFA 原則,您的應用程式可能會收到錯誤訊息。

處理此錯誤的方式,是在 MSAL.js 中進行互動式呼叫來取得權杖,例如 acquireTokenPopup 或 acquireTokenRedirect,如下列範例所示:

myMSALObj.acquireTokenSilent(accessTokenRequest).then(function(accessTokenResponse) {
    // call API
}).catch(function(error) {
    if (error instanceof InteractionRequiredAuthError) {
    
        // extract, if exists, claims from the error object
        if (error.claims) {
            accessTokenRequest.claims = error.claims,
        
        // call acquireTokenPopup in case of InteractionRequiredAuthError failure
        myMSALObj.acquireTokenPopup(accessTokenRequest).then(function(accessTokenResponse) {
            // call API
        }).catch(function(error) {
            console.log(error);
        });
    }
});

互動式取得令牌會提示使用者,並給予他們滿足條件存取政策的機會。

呼叫需要條件式存取的 API 時,您可能會在 API 傳回的錯誤中收到宣告挑戰。 在這種情況下,你可以將錯誤中回傳的聲明傳給claims存取權杖請求物件中的參數,以滿足適當的政策。

詳情請參閱 如何在應用程式中使用啟用持續存取評估的 API 。

使用其他框架

使用像 Tauri 這類工具包來支援註冊單頁應用程式(SPA)與身份平台,並不被認可為生產應用程式。 SPA 只支援正式版應用程式使用以 https 開頭的網址,以及本機開發使用以 http://localhost 開頭的網址。 像這樣的 tauri://localhost 前綴不能用於瀏覽器應用程式。 此格式僅支援行動或網頁應用程式,因為它們有機密元件,與瀏覽器應用程式不同。

錯誤與異常後重試

你在打電話給 MSAL 時,預期要自己執行重試政策。 MSAL 會對 Microsoft Entra 服務進行 HTTP 呼叫,偶爾會發生故障。 例如網路可能會當機或伺服器過載。

HTTP 429

當服務權杖伺服器(STS)因請求過多而超載時,會在 Retry-After 回應欄位回傳 HTTP 錯誤 429,並提示你還要多久才能再嘗試。

下一步

建議啟用 登入 MSAL.js ,幫助你診斷和除錯問題