Hantera fel och undantag i MSAL för Python

I MSAL för Python förmedlas de flesta fel som ett returvärde från API-anropet. Felet representeras som en ordlista som innehåller JSON-svaret från Microsofts identitetsplattform.

  • Ett lyckat svar innehåller "access_token" nyckeln. Formatet för svaret definieras av OAuth2-protokollet. Mer information finns i 5.1 Lyckat svar
  • Ett felsvar innehåller "error" och vanligtvis "error_description". Formatet för svaret definieras av OAuth2-protokollet. Mer information finns i 5.2 Felsvar

När ett fel returneras "error" innehåller nyckeln en maskinläsbar kod. Om "error" till exempel är en "interaction_required" kan du uppmana användaren att ange ytterligare information för att slutföra autentiseringsprocessen. Om "error" är "invalid_grant", kan du uppmana användaren att ange sina inloggningsuppgifter igen. Följande kodfragment är ett exempel på felhantering i MSAL för 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"))

När ett fel returneras "error_description" innehåller nyckeln också ett meddelande som kan läsas av människor, och det finns vanligtvis också en "error_code" nyckel som innehåller en maskinläsbar Microsofts identitetsplattform felkod. Mer information om de olika felkoderna för Microsofts identitetsplattform finns i Felkoder för autentisering och auktorisering.

I MSAL för Python är undantag sällsynta eftersom de flesta fel hanteras genom att returnera ett felvärde. Undantaget ValueError utlöses bara när det finns ett problem med hur du försöker använda biblioteket, till exempel när API-parametrar är felaktigt formaterade.

Villkorsstyrd åtkomst och claims-utmaningar

När du hämtar token utan användarinteraktion kan din applikation få fel om ett API som du försöker komma åt kräver en anspråksutmaning för villkorlig åtkomst, till exempel en MFA-policy.

Mönstret för att hantera det här felet är att interaktivt hämta en token med hjälp av MSAL. Detta uppmanar användaren och ger dem möjlighet att uppfylla den nödvändiga principen för villkorsstyrd åtkomst.

I vissa fall, när du anropar ett API som kräver villkorsstyrd åtkomst, kan du få en anspråksutmaning i felmeddelandet från API:et. Om principen för villkorsstyrd åtkomst till exempel ska ha en hanterad enhet (Intune) blir felet ungefär som AADSTS53000: Enheten måste hanteras för att få åtkomst till den här resursen eller något liknande. I det här fallet kan du skicka med anspråken i anropet för att hämta en token så att användaren uppmanas att uppfylla kraven i rätt policy.

Försök igen efter fel och undantag

MSAL gör HTTP-anrop till Microsoft Entra-tjänsten och ibland kan fel uppstå. Nätverket kan till exempel gå ner eller så är servern överbelastad.

MSAL Python 1.11+ utför automatiskt ett nytt försök åt dig. Du kan anpassa det här beteendet genom att http_client följa anpassningsanvisningarna.

HTTP 429

När servicetokenservern (STS) är överbelastad med för många begäranden returneras HTTP-fel 429 med en ledtråd om hur lång tid tills du kan försöka igen i svarsfältet Retry-After .

Din app skulle begränsa de efterföljande begärandena och endast göra ett nytt försök efter den angivna tidsperioden.

MSAL Python 1.16+ gör det enkelt för dig att försöka igen med en autentiseringsbegäran på begäran (till exempel när slutanvändaren klickar på inloggningsknappen igen) skulle MSAL Python 1.16+ automatiskt begränsa dessa återförsök genom att returnera samma felsvar från en HTTP-cache och bara skicka ut ett riktigt HTTP-anrop när samtalet görs efter den angivna perioden.

Som standard fungerar den här strypningsmekanismen genom att spara strypningsinformation i ett inbyggt HTTP-cache i minnet. Du kan ange ett eget dict-like-objekt som HTTP-cache, som du kan styra hur innehållet ska sparas. Mer information finns i dokumentationen för MSAL Python API.

Nästa steg