Zpracování chyb a výjimek v msAL pro Python

Ve službě MSAL pro Python se většina chyb předává jako návratová hodnota z volání rozhraní API. Chyba je reprezentována jako slovník obsahující odpověď JSON z Microsoft identity platform.

  • Úspěšná odpověď obsahuje "access_token" klíč. Formát odpovědi je definován protokolem OAuth2. Další informace naleznete v tématu 5.1 Úspěšná odpověď
  • Chybová odpověď obsahuje "error" a obvykle "error_description". Formát odpovědi je definován protokolem OAuth2. Další informace naleznete v tématu 5.2 Chybová odpověď

Když se vrátí chyba, "error" klíč obsahuje strojově čitelný kód. "error" Pokud je to například příkaz "interaction_required", můžete uživatele vyzvat k zadání dalších informací k dokončení procesu ověřování. Pokud je "error""invalid_grant", můžete uživatele vyzvat k opětovnému zadání přihlašovacích údajů. Následující fragment kódu je příkladem zpracování chyb v knihovně MSAL pro Python.


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"))

Když se vrátí chyba, "error_description" klíč obsahuje také zprávu čitelnou pro člověka a obvykle existuje také "error_code" klíč, který obsahuje strojově čitelný kód chyby Microsoft identity platform. Další informace o různých kódech chyb Microsoft identity platform naleznete v tématu Kódy chyb ověřování a autorizace.

V msAL pro Python jsou výjimky vzácné, protože většina chyb se zpracovává vrácením chybové hodnoty. Výjimka ValueError se vyvolá jenom v případě, že dojde k problému s tím, jak se pokoušíte knihovnu použít, například když jsou parametry rozhraní API poškozené.

Podmíněný přístup a problémy s claimy

Při tichém získávání tokenů může ve vaší aplikaci docházet k chybám, pokud rozhraní API, ke kterému se pokoušíte získat přístup, vyžaduje výzvu deklarací podmíněného přístupu, například kvůli zásadám MFA.

Vzor pro zpracování této chyby spočívá v interaktivním získání tokenu pomocí knihovny MSAL. Tím uživatele vyzvete a získáte mu možnost splnit požadované zásady podmíněného přístupu.

V některých případech můžete při volání rozhraní API, které vyžaduje podmíněný přístup, obdržet v chybové odpovědi z rozhraní API výzvu deklarací. Pokud například zásada podmíněného přístupu vyžaduje spravované zařízení (Intune), chybová zpráva bude vypadat přibližně takto: AADSTS53000: Aby bylo možné získat přístup k tomuto prostředku, musí být vaše zařízení spravované nebo podobně. V takovém případě můžete ve volání pro získání tokenu předat claims, aby byl uživatel vyzván ke splnění příslušných zásad.

Opakování po chybách a výjimkách

MsAL provádí volání HTTP do služby Microsoft Entra a občas může dojít k selháním. Například síť může jít dolů nebo je server přetížen.

MSAL Python 1.11+ automaticky provede jeden pokus o opakování za vás. Toto chování můžete přizpůsobit podle pokynů k http_client přizpůsobení.

HTTP 429

Pokud je server tokenů služby (STS) přetížen příliš mnoha požadavky, vrátí chybu HTTP 429 s nápovědou o tom, jak dlouho, než to můžete zkusit znovu v Retry-After poli odpovědi.

Od vaší aplikace se očekávalo, že omezí rychlost následných požadavků a zopakuje je až po uplynutí zadané doby.

MSAL Python 1.16+ usnadňuje opakování žádosti o ověření na vyžádání (například pokaždé, když koncový uživatel znovu klikne na tlačítko pro přihlášení), nástroj MSAL Python 1.16+ automaticky omezí tyto pokusy o opakování vrácením stejné chybové odpovědi z mezipaměti HTTP a pouze odesláním skutečného volání HTTP v případě pokusu o volání po zadaném období.

Ve výchozím nastavení tento mechanismus omezení funguje tak, že ukládá údaje o omezení do integrované paměťové mezipaměti HTTP. Jako mezipaměť HTTP můžete použít vlastní objekt podobný dict, u kterého můžete řídit, jak se bude jeho obsah uchovávat. Další podrobnosti najdete v dokumentaci k rozhraní MSAL Python API.

Další kroky