Обработка ошибок и исключений в MSAL для Python

В MSAL для Python большинство ошибок передаются как возвращаемое значение из вызова API. Ошибка представлена в виде словаря, содержащего ответ JSON из платформа удостоверений Майкрософт.

  • Успешный ответ содержит ключ "access_token". Формат ответа определяется протоколом OAuth2. Дополнительные сведения см. в разделе 5.1 Успешный ответ
  • Сообщение об ошибке содержит "error" и обычно "error_description". Формат ответа определяется протоколом OAuth2. Дополнительные сведения см. в статье об ошибке 5.2.

При возврате ошибки ключ "error" содержит машиночитаемый код. Если "error" является, например, "interaction_required", вы можете предложить пользователю предоставить дополнительную информацию, чтобы завершить процесс аутентификации. Если "error" имеет значение "invalid_grant", можно предложить пользователю повторно ввести свои учетные данные. Следующий фрагмент кода является примером обработки ошибок в MSAL для 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"))

Когда возвращается ошибка, ключ "error_description" также содержит понятное человеку сообщение, и, как правило, также присутствует ключ "error_code", содержащий машиночитаемый код ошибки платформа удостоверений Майкрософт. Дополнительные сведения о различных кодах ошибок платформа удостоверений Майкрософт см. в разделе "Коды ошибок проверки подлинности и авторизации".

В MSAL для Python исключения редки, так как большинство ошибок обрабатываются путем возврата значения ошибки. Исключение ValueError возникает только при возникновении проблемы с тем, как вы пытаетесь использовать библиотеку, например при неправильном изменении параметров API.

Проблемы условного доступа и утверждений

При получении токенов в фоновом режиме приложение может получать ошибки, если API, к которому вы пытаетесь получить доступ, требует запрос утверждений Conditional Access, например политику MFA.

Стандартный способ обработки этой ошибки — интерактивно получить токен с помощью MSAL. Пользователю будет предложено выполнить необходимые действия, чтобы соблюсти требования политики условного доступа.

В некоторых случаях при вызове API, требующего условного доступа, вы можете получить запрос утверждений в сообщении об ошибке API. Например, если политика условного доступа требует, чтобы устройство было управляемым (Intune), ошибка будет примерно такой: AADSTS53000: Ваше устройство должно быть управляемым для доступа к этому ресурсу или аналогичное сообщение. В этом случае можно передать утверждения в вызове получения маркера, чтобы пользователю было предложено выполнить требования соответствующей политики.

Повторная попытка после ошибок и исключений

MSAL выполняет http-вызовы к службе Microsoft Entra и иногда могут возникать сбои. Например, сеть может пойти вниз или сервер перегружен.

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-кэша, при этом вы можете контролировать способ сохранения его содержимого. Дополнительные сведения см. в документации по API MSAL Python.

Дальнейшие действия