Errors

BrowserConfigurationAuthErrors

вызвано_заглушенное_приложение_общедоступного_клиента

Сообщение об ошибке: был вызван экземпляр-заглушка общедоступного клиентского приложения. Если используется msal-react, убедитесь, что контекст не используется без поставщика.

См. ошибки msal-react

BrowserAuthErrors

Interaction_in_progress

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

Эта ошибка возникает при вызове интерактивного API (loginPopup, loginRedirect, acquireTokenPopup, ) acquireTokenRedirectво время выполнения другого интерактивного API. Интерфейсы API для входа и полученияToken являются асинхронными, поэтому необходимо убедиться, что полученные обещания разрешены перед вызовом другого.

Использование loginPopup или acquireTokenPopup

Убедитесь, что обещание, возвращенное из этих API, было разрешено перед вызовом другого.

❌ В следующем примере возникнет эта ошибка, поскольку loginPopup всё ещё будет выполняться, когда будет вызван acquireTokenPopup:

const request = { scopes: ["openid", "profile"] };
loginPopup();
acquireTokenPopup(request);

✔️ Чтобы решить эту проблему, убедитесь, что все интерактивные API уже завершили работу, прежде чем вызывать следующий API:

const request = { scopes: ["openid", "profile"] };
await msalInstance.loginPopup();
await msalInstance.acquireTokenPopup(request);

Использование loginRedirect или acquireTokenRedirect

При использовании API перенаправления необходимо вызвать handleRedirectPromise при возврате после перенаправления. Это гарантирует корректную обработку ответа с токеном от сервера и очистку временных записей кэша. Эта ошибка возникает, если handleRedirectPromise не успевает завершиться до того, как приложение вызывает loginRedirect или acquireTokenRedirect.

❌ Следующий пример вызовет эту ошибку, так как handleRedirectPromise по-прежнему будет обрабатывать ответ после предыдущего вызова loginRedirect, когда loginRedirect вызывается во второй раз:

msalInstance.handleRedirectPromise();

const accounts = msalInstance.getAllAccounts();
if (accounts.length === 0) {
    // No user signed in
    msalInstance.loginRedirect();
}

✔️ Чтобы устранить проблему, необходимо дождаться завершения handleRedirectPromise перед вызовом любого интерактивного API:

await msalInstance.handleRedirectPromise();

const accounts = msalInstance.getAllAccounts();
if (accounts.length === 0) {
    // No user signed in
    msalInstance.loginRedirect();
}

Или также:

msalInstance
    .handleRedirectPromise()
    .then((tokenResponse) => {
        if (!tokenResponse) {
            const accounts = msalInstance.getAllAccounts();
            if (accounts.length === 0) {
                // No user signed in
                msalInstance.loginRedirect();
            }
        } else {
            // Do something with the tokenResponse
        }
    })
    .catch((err) => {
        // Handle error
        console.error(err);
    });

Примечание: Если вы вызываете loginRedirect или acquireTokenRedirect со страницы, которая не является вашей redirectUri, необходимо убедиться, что вызов handleRedirectPromise выполняется с ожиданием завершения как на странице redirectUri, так и на странице, с которой вы инициировали перенаправление. Это связано с тем, что страница redirectUri инициирует перенаправление обратно на страницу, которая изначально вызвала loginRedirect, и эта страница обработает ответ с токеном.

Библиотеки-оболочки

Если вы используете одну из наших библиотек оболочки (React или Angular), ознакомьтесь с документацией по ошибкам в этих конкретных библиотеках по дополнительным причинам, по которым может возникнуть эта ошибка:

Если вы не используете ни одну из библиотек-обёрток, но опасаетесь, что ваше приложение может инициировать параллельные интерактивные запросы, перед тем как вызывать взаимодействие в методе получения токена, следует проверить, не выполняется ли уже другое взаимодействие. Это можно достичь, реализуя глобальное состояние приложения или широковещательную службу и т. д., которая выдает текущее состояние взаимодействия MSAL через API событий MSAL.

❌ Следующий пример вызовет эту ошибку, так как acquireTokenPopup в блоке catch не проверяется, происходит ли другое взаимодействие в данный момент:

async function myAcquireToken(request) {
    const msalInstance = getMsalInstance(); // get the msal application instance

    const tokenRequest = {
        account: msalInstance.getActiveAccount() || null;
        ...request
    };

    let tokenResponse;

    try {
        // attempt silent acquisition first
        tokenResponse = await msalInstance.acquireTokenSilent(tokenRequest);
    } catch (error) {
        if (error instanceof InteractionRequiredAuthError) {
            try {
                tokenResponse = await msalInstance.acquireTokenPopup(tokenRequest);
            } catch (err) {
                console.log(err);
                // handle other errors
            }
        }

        console.log(error);
        // handle other errors
    }

    return tokenResponse;
};

const request = {
    scopes: ["User.Read"]
};

myAcquireToken(request);
myAcquireToken(request);

✔️ Чтобы устранить проблему, перед вызовом любого другого интерактивного API необходимо дождаться None состояния взаимодействия:

async function myAcquireToken(request) {
    const msalInstance = getMsalInstance(); // get the msal application instance

    const tokenRequest = {
        account: msalInstance.getActiveAccount() || null;
        ...request
    };

    let tokenResponse;

    try {
        // attempt silent acquisition first
        tokenResponse = await msalInstance.acquireTokenSilent(tokenRequest);
    } catch (error) {
        if (error instanceof InteractionRequiredAuthError) {
            // check for any interactions
            if (myGlobalState.getInteractionStatus() !== InteractionStatus.None) {
                // throw a new error to be handled in the caller below
                throw new Error("interaction_in_progress");
            } else {
                // no interaction, invoke popup flow
                tokenResponse = await msalInstance.acquireTokenPopup(tokenRequest);
            }
        }

        console.log(error);
        // handle other errors
    }

    return tokenResponse;
};

async function myInteractionInProgressHandler() {
    /**
     * "myWaitFor" method polls the interaction status via getInteractionStatus() from
     * the application state and resolves when it's equal to "None".
     */
    await myWaitFor(() => myGlobalState.getInteractionStatus() === InteractionStatus.None);

    // wait is over, call myAcquireToken again to re-try acquireTokenSilent
    return (await myAcquireToken(tokenRequest));
};

const request = {
    scopes: ["User.Read"]
};

myAcquireToken(request).catch((e) => myInteractionInProgressHandler());
myAcquireToken(request).catch((e) => myInteractionInProgressHandler());

Шаги по устранению неполадок

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

  • Подробные логи
  • Пример приложения и/или фрагменты кода, которые можно использовать для воспроизведения проблемы
  • Обновите страницу. Ошибка исчезает?
  • Откройте приложение в новой вкладке. Ошибка исчезла?

block_iframe_reload

Сообщение об ошибке: запрос был заблокирован внутри iframe, так как MSAL обнаружил ответ проверки подлинности.

Эта ошибка возникает при вызове ssoSilent или acquireTokenSilent, если страница, используемая в качестве redirectUri, пытается вызвать функцию login или acquireToken. В качестве рекомендуемой меры по устранению этой проблемы установите для redirectUri пустую страницу, на которой не используется MSAL, при вызове неинтерактивных API. Это также позволит повысить производительность, так как скрытый iframe не требует отрисовки страницы.

✔️ Это можно сделать отдельно для каждого запроса, например:

msalInstance.acquireTokenSilent({
    scopes: ["User.Read"],
    redirectUri: "http://localhost:3000/blank.html",
});

Помните, что вам потребуется зарегистрировать это новое redirectUri в регистрации приложения.

Если вы не хотите использовать выделенный redirectUri для этой цели, вместо этого убедитесь, что вы redirectUri не пытаетесь вызывать API MSAL при отрисовке внутри скрытого iframe, используемого автоматическими API.

monitor_window_timeout

Сообщения об ошибках:

  • Не удалось получить токен в iframe из-за тайм-аута.

Эта ошибка может возникнуть при вызове ssoSilent, acquireTokenSilent, acquireTokenPopup или loginPopup, и это может произойти по нескольким причинам. Ниже приведены некоторые из наиболее распространенных вариантов:

  1. Страница, которую вы используете в качестве redirectUri, удаляет хеш или изменяет его
  2. Страница, используемая в качестве вашей redirectUri страницы, автоматически перемещается на другую страницу.
  3. Ваш поставщик удостоверяющих данных ограничивает частоту запросов
  4. Ваш поставщик удостоверений не перенаправил вас обратно на redirectUri.

Важно. Если приложение использует библиотеку маршрутизатора (например, React Router, Angular Router), убедитесь, что она не удаляет хэш или автоматическое перенаправление во время приобретения токена MSAL. Если это возможно, лучше всего, если страница redirectUri не вызывает маршрутизатор вообще.

Проблемы, вызванные страницей redirectUri

Когда вы выполняете тихий вызов, в некоторых случаях открывается iframe, который переходит на страницу авторизации вашего поставщика удостоверений. После того как поставщик удостоверений авторизует пользователя, он перенаправит iframe обратно к redirectUri с кодом авторизации или информацией об ошибке в хэш-фрагменте. Экземпляр MSAL, запущенный во фрейме или окне, из которого изначально был отправлен запрос, извлечёт этот хэш ответа и обработает его. Если ваш redirectUri удаляет или изменяет этот хеш либо выполняет переход на другую страницу до того, как MSAL успеет его извлечь, вы получите эту ошибку тайм-аута.

✔️ Чтобы решить эту проблему, следует убедиться, что страница, используемая в качестве redirectUri, не делает ничего из перечисленного ниже, по крайней мере при загрузке во всплывающем окне или iframe. Мы рекомендуем использовать пустую страницу в качестве redirectUri в тихом режиме и во всплывающем окне, чтобы ничего из этого не произошло.

Это можно сделать для каждого запроса отдельно, например:

msalInstance.acquireTokenSilent({
    scopes: ["User.Read"],
    redirectUri: "http://localhost:3000/blank.html",
});

Помните, что вам потребуется зарегистрировать это новое redirectUri в регистрации приложения.

Заметки об Angular и React:

  • Если вы используете @azure/msal-angular, ваша страница redirectUri не должна быть защищена с помощью MsalGuard.
  • Если вы используете @azure/msal-react, ваша страница redirectUri не должна отображать MsalAuthenticationComponent или использовать хук useMsalAuthentication.

Проблемы, вызванные поставщиком удостоверений

Throttling

Одной из наиболее распространённых причин возникновения этой ошибки может быть то, что ваше приложение застряло в цикле или отправило слишком много запросов токенов за короткий промежуток времени. Когда это происходит, поставщик удостоверений может на короткое время ограничить обработку последующих запросов, из-за чего перенаправление обратно в вашу redirectUri не произойдет, что в конечном итоге приведет к этой ошибке.

✔️ Чтобы устранить проблемы, связанные с регулированием, у вас есть 2 варианта:

  1. Прежде чем повторить попытку, остановите выполнение запросов в течение короткого времени.
  2. Вызов интерактивного API, например acquireTokenPopup или acquireTokenRedirect.
X-Frame-Options DENY

Эта ошибка также может возникать, если поставщик удостоверений не перенаправляет пользователя обратно в ваше приложение. В сценариях без взаимодействия с пользователем эта ошибка иногда сопровождается ошибкой X-Frame-Options: Deny, указывающей на то, что поставщик удостоверяющих данных либо пытается показать вам сообщение об ошибке, либо ожидает взаимодействия с пользователем.

✔️ Ошибка X-Frame-Options обычно имеет URL-адрес и открытие этого URL-адреса на новой вкладке может помочь вам определить, что происходит. Если требуется взаимодействие, вместо этого рассмотрите возможность использования интерактивного API. Если отображается ошибка, устраните её.

Ожидается, что некоторые потоки B2C вызывают эту ошибку из-за необходимости взаимодействия с пользователем. К этим потокам относятся:

  • Сброс пароля
  • Изменение профиля
  • Регистрация
  • Некоторые пользовательские политики в зависимости от их конфигурации
Задержка в сети

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

✔️ Время ожидания по умолчанию составляет около 10 секунд и в большинстве случаев этого должно быть достаточно; однако если вашему поставщику удостоверений требуется больше времени для перенаправления, вы можете увеличить это время ожидания в конфигурации MSAL с помощью параметров конфигурации iframeHashTimeout, windowHashTimeout или loadFrameTimeout.

const msalConfig = {
    auth: {
        clientId: "your-client-id",
    },
    system: {
        windowHashTimeout: 9000, // Applies just to popup calls - In milliseconds
        iframeHashTimeout: 9000, // Applies just to silent calls - In milliseconds
        loadFrameTimeout: 9000, // Applies to both silent and popup calls - In milliseconds
    },
};

hash_empty_error

Сообщения об ошибках:

Хэш-значение не может быть обработано, так как оно пусто. Убедитесь, что ваш redirectUri не очищает хеш.

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

Чтобы устранить эту ошибку, рекомендуется использовать выделенную страницу redirectUri, которая не распространяется на маршрутизатор. Для беззвучных вызовов и для всплывающих вызовов лучше всего использовать пустую страницу. Если это невозможно, убедитесь, что маршрутизатор не перемещается во время приобретения токена MSAL. Это можно сделать, определив, загружено ли ваше приложение в iframe для silent-вызовов, во всплывающем окне для popup-вызовов или ожидая handleRedirectPromise для вызовов перенаправления.

hash_does_not_contain_known_properties

Сообщения об ошибках:

Хэш не содержит известных свойств. Убедитесь, что redirectUri не изменяет хеш.

См. описание hash_empty_error выше. Основная причина этой ошибки аналогична, разница в том, что хэш был изменен, а не удален.

Не удалось получить токен с нативной платформы

Сообщения об ошибках:

  • Не удалось получить токен из родной платформы.

Эта ошибка возникает при вызове API acquireTokenByCode с использованием nativeAccountId вместо code, когда приложение выполняется в среде, которая не получает токены от собственного брокера. Чтобы ознакомиться со списком предварительных условий, обратитесь к документации о токенах, привязанных к устройству.

Нативное подключение не установлено

Сообщения об ошибках:

  • Подключение к собственной платформе не установлено. Установите совместимое расширение браузера и выполните инициализацию().

Эта ошибка возникает при входе пользователя с помощью собственного брокера, но в настоящее время нет подключения к собственному брокеру. Это может произойти по следующим причинам:

  • Расширение учетных записей Windows было удалено или отключено
  • API initialize не был вызван или его завершения не дождались перед вызовом другого API MSAL

uninitialized_public_client_application

Сообщения об ошибках:

  • Прежде чем пытаться вызвать любой другой API MSAL, необходимо вызвать функцию initialize и дождаться её завершения.

Эта ошибка возникает, если API login, acquireToken или handleRedirectPromise вызывается до вызова API initialize. Необходимо вызвать initialize API и дождаться его завершения, прежде чем пытаться получить токены.

❌ Следующий пример вызовет эту ошибку, так как handleRedirectPromise вызывается до завершения инициализации:

const msalInstance = new PublicClientApplication({
    auth: {
        clientId: "your-client-id",
    },
    system: {
        allowNativeBroker: true,
    },
});

await msalInstance.handleRedirectPromise(); // This will throw
msalInstance.acquireTokenSilent(); // This will also throw

✔️ Чтобы решить проблему, следует дождаться завершения initialize перед вызовом любых других API MSAL:

const msalInstance = new PublicClientApplication({
    auth: {
        clientId: "your-client-id",
    },
    system: {
        allowNativeBroker: true,
    },
});

await msalInstance.initialize();
await msalInstance.handleRedirectPromise(); // This will no longer throw this error since initialize completed before this was invoked
msalInstance.acquireTokenSilent(); // This will also no longer throw this error

Other

Ошибки, не вызванные msal, например ошибки сервера

Доступ для выполнения запроса к [url] был заблокирован политикой CORS

Эта ошибка возникает с MSAL.js версии 2.x и возникает из-за неправильной настройки во время регистрации приложений на портал Azure. В частности, необходимо убедиться, что ваш redirectUri зарегистрирован как тип: Single-page application в разделе Аутентификация в вашей регистрации приложения. При успешном завершении вы увидите зеленый флажок, который говорит:

Ваш URI перенаправления может использоваться в потоке Authorization Code с PKCE.

изображение