本文概述了不同類型的錯誤,並提出處理常見登入錯誤的建議。
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 ,幫助你診斷和除錯問題