在 Python 的 MSAL 中,大多數錯誤會以 API 呼叫的回傳值來呈現。 錯誤以包含 Microsoft 身分識別平台 的 JSON 回應字典表示。
- 成功的回應包含了該
"access_token"金鑰。 回應格式由 OAuth2 協定定義。 更多資訊請參見 5.1 成功回應 - 錯誤回應通常包含
"error"和"error_description"。 回應格式由 OAuth2 協定定義。 欲了解更多資訊,請參閱 5.2 錯誤回應
當回傳錯誤時,該 "error" 金鑰包含一個機器可讀的程式碼。 例如,如果是"error""interaction_required",你可以提示使用者提供額外資訊以完成認證流程。 如果是"error""invalid_grant",你可以提示使用者重新輸入憑證。 以下摘錄為 Python MSAL 錯誤處理的範例。
from msal import ConfidentialClientApplication
authority_url = "https://login.microsoftonline.com/your_tenant_id"
client_id = "your_client_id"
client_secret = "your_client_secret"
scopes = ["https://graph.microsoft.com/.default"]
app = ConfidentialClientApplication(client_id, authority=authority_url, client_credential=client_secret)
result = app.acquire_token_silent(scopes=scopes, account=None)
if not result:
result = app.acquire_token_silent(scopes=scopes)
if "access_token" in result:
print("Access token: %s" % result["access_token"])
else:
print("Error: %s" % result.get("error"))
當傳回錯誤時,"error_description" 索引鍵也會包含人類可讀訊息,而通常也會有一個 "error_code" 索引鍵,其中包含機器可讀的 Microsoft 身分識別平台錯誤碼。 欲了解更多關於各種 Microsoft 身分識別平台 錯誤代碼的資訊,請參見認證與授權錯誤代碼。
在 Python 的 MSAL 中,例外很少見,因為大多數錯誤都是透過回傳錯誤值來處理的。
ValueError例外只有在你嘗試使用函式庫的方式出現問題時才會跳出,例如 API 參數形狀錯誤。
條件存取與理賠挑戰
當以靜默方式取得權杖時,如果您嘗試存取的 API 要求 條件式存取宣告挑戰(例如 MFA 原則),您的應用程式可能會收到錯誤。
處理此錯誤的模式是透過 MSAL 互動式取得令牌。 這會提示使用者,並給予他們機會滿足所需的條件存取政策。
在某些情況下,當呼叫需要條件存取的 API 時,你可能會在錯誤中收到 API 的理據挑戰。 例如,如果條件存取政策是要有受管理的裝置(Intune),錯誤會是像 AADSTS53000:你的裝置必須被管理才能存取此資源 或類似的訊息。 在這種情況下,你可以在取得權杖的呼叫中傳遞宣告,系統便會提示使用者滿足適當的原則。
錯誤與異常後重試
MSAL 會對 Microsoft Entra 服務進行 HTTP 呼叫,偶爾會發生故障。 例如網路可能會當機或伺服器過載。
MSAL Python 1.11+ 會自動幫你重試一次。
你可以依照http_client自訂說明來自訂此行為。
HTTP 429
當服務權杖伺服器(STS)因請求過多而超載時,會在回應欄位回傳 HTTP 錯誤 429,並提示你還要多久才能再 Retry-After 嘗試。
你的應用程式應對後續要求進行節流,並且僅在指定期間過後才重試。
MSAL Python 1.16+ 讓你能隨時重試認證請求(例如當終端使用者再次點擊登入按鈕時),MSAL Python 1.16+ 會自動限速這些重試,因為它會從 HTTP 快取回傳相同的錯誤回應,且只有在指定時間後才發出真正的 HTTP 呼叫。
預設情況下,這種節流機制是透過將節流資訊儲存到內建的記憶體 HTTP 快取中來運作。
你可以提供自己的 dict類似 HTTP 快取物件,並控制如何持久化其內容。
更多細節請參閱 MSAL Python API 文件。
下一步
- 建議在 Python 的 MSAL 中啟用「Loging」功能,幫助你診斷和除錯問題。