Lidar com erros e exceções em MSAL para Python

No MSAL para Python, a maioria dos erros é transmitida como valor de retorno da chamada API. O erro é representado como um dicionário contendo a resposta JSON da plataforma de identidades da Microsoft.

  • Uma resposta bem-sucedida contém a "access_token" chave. O formato da resposta é definido pelo protocolo OAuth2. Para mais informações, consulte 5.1 Resposta Bem-sucedida
  • Uma resposta de erro contém "error" e normalmente "error_description". O formato da resposta é definido pelo protocolo OAuth2. Para mais informações, consulte 5.2 Resposta ao Erro

Quando um erro é devolvido, a "error" chave contém um código legível por máquina. Se for "error" , por exemplo, um "interaction_required", pode pedir ao utilizador que forneça informações adicionais para completar o processo de autenticação. Se "error" estiver "invalid_grant", pode solicitar ao utilizador que introduza novamente as suas credenciais. O seguinte excerto é um exemplo de tratamento de erros em MSAL para 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"))

Quando um erro é devolvido, a "error_description" chave contém também uma mensagem legível por humanos, e normalmente há também uma "error_code" chave que contém um código de erro da plataforma de identidades da Microsoft legível por máquina. Para mais informações sobre os vários códigos de erro da plataforma de identidades da Microsoft, consulte Códigos de erro de autenticação e autorização.

No MSAL para Python, as exceções são raras porque a maioria dos erros é tratada ao devolver um valor de erro. A ValueError exceção só é lançada quando há um problema na forma como tentas usar a biblioteca, como quando o(s) parâmetro(s) da API estão malformados.

Acesso Condicional e desafios de sinistros

Ao obter tokens silenciosamente, a sua aplicação pode receber erros quando um pedido de reivindicações de Acesso Condicional, como uma política de MFA, for exigido pela API à qual está a tentar aceder.

O padrão para lidar com este erro é adquirir interativamente um token usando MSAL. Isto incita o utilizador e dá-lhe a oportunidade de cumprir a política de Acesso Condicional exigida.

Em determinados casos, ao chamar uma API que requer Acesso Condicional, pode receber um pedido de declarações na mensagem de erro da API. Por exemplo, se a política de Acesso Condicional for ter um dispositivo gerido (Intune), o erro será algo como AADSTS53000: O seu dispositivo é obrigado a ser gerido para aceder a este recurso ou algo semelhante. Neste caso, pode passar as declarações na chamada de aquisição de token para que o utilizador seja solicitado a satisfazer a política adequada.

Tentar novamente após erros e exceções

A MSAL faz chamadas HTTP ao serviço Microsoft Entra e, ocasionalmente, podem ocorrer falhas. Por exemplo, a rede pode cair ou o servidor ficar sobrecarregado.

O MSAL Python 1.11+ efetua automaticamente uma nova tentativa por si. Pode personalizar este comportamento seguindo as http_client instruções de personalização.

HTTP 429

Quando o Service Token Server (STS) está sobrecarregado com demasiados pedidos, devolve o erro HTTP 429 com uma dica sobre quanto tempo até poderes tentar novamente no Retry-After campo de resposta.

Esperava-se que a sua aplicação limitasse os pedidos subsequentes e só tentasse novamente após o período especificado.

O MSAL Python 1.16+ permite-lhe repetir facilmente um pedido de autenticação a pedido (por exemplo, sempre que o utilizador final volta a clicar no botão de iniciar sessão). O MSAL Python 1.16+ limita automaticamente essas tentativas, devolvendo a mesma resposta de erro a partir de uma cache HTTP e só enviando uma chamada HTTP real quando essa chamada é efetuada após o período especificado.

Por defeito, este mecanismo de aceleração funciona guardando a informação do acelerador numa cache HTTP integrada em memória. Pode fornecer o seu próprio objeto do tipo dict como cache HTTP, sobre o qual pode controlar a forma de persistir o respetivo conteúdo. Consulte a documentação da API MSAL Python para mais detalhes.

Passos seguintes