Errors

ErrosDeAutenticacaoDaConfiguracaoDoNavegador

stubbed_public_client_application_called

Mensagem de erro: instância stub do Aplicativo Cliente Público foi chamada. Se estiver usando msal-react, certifique-se de que o contexto não seja usado sem um provedor.

Ver erros de msal-react

BrowserAuthErrors

Interação_em_andamento

Mensagem de erro: a interação está em andamento no momento. Verifique se essa interação foi concluída antes de chamar uma API interativa.

Esse erro é gerado quando uma API interativa (loginPopup, loginRedirect, , acquireTokenPopupacquireTokenRedirect) é invocada enquanto outra API interativa ainda está em andamento. As APIs de logon e acquireToken são assíncronas, portanto, você precisará garantir que as promessas resultantes tenham sido resolvidas antes de invocar outra.

Usando loginPopup ou acquireTokenPopup

Verifique se a promessa retornada dessas APIs foi resolvida antes de invocar outra.

❌ O exemplo a seguir gerará esse erro porque loginPopup ainda estará em andamento quando acquireTokenPopup for chamado:

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

✔️ Para resolver isso, você deve garantir que todas as APIs interativas tenham sido resolvidas antes de invocar outra:

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

Usando loginRedirect ou acquireTokenRedirect

Ao usar APIs de redirecionamento, handleRedirectPromise deve ser invocado ao retornar do redirecionamento. Isso garante que a resposta do token do servidor seja tratada corretamente e as entradas de cache temporárias sejam limpas. Esse erro é gerado quando handleRedirectPromise não teve a chance de ser concluído antes que o aplicativo invoque loginRedirect ou acquireTokenRedirect.

❌ O exemplo a seguir gerará esse erro porque handleRedirectPromise ainda processará a resposta de uma chamada anterior loginRedirect quando loginRedirect for chamada uma segunda vez:

msalInstance.handleRedirectPromise();

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

✔️ Para resolver isso, você deve aguardar que handleRedirectPromise seja concluído antes de chamar qualquer API interativa:

await msalInstance.handleRedirectPromise();

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

Ou, como alternativa:

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);
    });

Nota: Se você estiver chamando loginRedirect ou acquireTokenRedirect de uma página que não seja sua redirectUri, precisará garantir que handleRedirectPromise seja chamado e aguardado tanto na página redirectUri quanto na página a partir da qual você iniciou o redirecionamento. Isso ocorre porque a redirectUri página iniciará um redirecionamento de volta para a página que invocou loginRedirect originalmente e essa página processará a resposta do token.

Bibliotecas Wrapper

Se você estiver usando uma de nossas bibliotecas de wrapper (React ou Angular), consulte os documentos de erro nessas bibliotecas específicas por motivos adicionais que você pode estar recebendo este erro:

Se você não estiver usando nenhuma das bibliotecas de wrapper, mas estiver preocupado que seu aplicativo possa disparar solicitações interativas simultâneas, verifique se alguma outra interação está em andamento antes de invocar uma interação em seu método de aquisição de token. Você pode fazer isso implementando um estado de aplicativo global ou um serviço de difusão etc. que emite o status de interação MSAL atual por meio da API de Eventos MSAL.

❌ O exemplo a seguir gerará esse erro porque o acquireTokenPopup bloco catch não verifica se há outra interação ocorrendo no momento:

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

✔️ Para resolver isso, você deve aguardar até que o status da interação seja None antes de chamar qualquer outra API interativa:

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());

Etapas de solução de problemas

  • Habilite o log detalhado e rastreie a ordem dos eventos. Verifique se handleRedirectPromise é chamado e retorna antes que qualquer API login ou acquireToken seja chamada.

Se você não conseguir descobrir por que esse erro está sendo gerado, abra um problema e esteja preparado para compartilhar as seguintes informações:

  • Logs detalhados
  • Um aplicativo de exemplo e/ou snippets de código que podemos usar para reproduzir o problema
  • Atualize a página. O erro desaparece?
  • Abra seu aplicativo em uma nova guia. O erro desaparece?

block_iframe_reload

Mensagem de erro: a solicitação foi bloqueada dentro de um iframe porque a MSAL detectou uma resposta de autenticação.

This error is thrown when calling ssoSilent ou acquireTokenSilent e a página usada como seu redirectUri está tentando invocar uma função de login ou acquireToken. Nossa mitigação recomendada para isso é definir redirectUri como uma página em branco que não implementa o MSAL ao chamar APIs silenciosas. Isso também terá o benefício adicional de melhorar o desempenho, pois o iframe oculto não precisa renderizar sua página.

✔️ Você pode fazer isso por solicitação, por exemplo:

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

Lembre-se de que você precisará registrar este novo redirectUri no Registro do seu Aplicativo.

Se você não quiser usar um(a) redirectUri dedicado(a) para essa finalidade, em vez disso, deve garantir que o seu/sua redirectUri não tente chamar APIs do MSAL quando for renderizado(a) dentro do iframe oculto usado pelas APIs silenciosas.

monitor_window_timeout

Mensagens de erro:

  • A aquisição de token em iframe falhou devido ao tempo esgotado.

Esse erro pode ser gerado ao chamarssoSilent, acquireTokenSilentacquireTokenPopup ou loginPopup há vários motivos para isso acontecer. Estes são alguns dos mais comuns:

  1. A página que você usa como redirectUri está removendo ou manipulando o hash
  2. A página que você usa como sua redirectUri está redirecionando automaticamente para uma página diferente
  3. Você está sendo limitado pelo seu provedor de identidade.
  4. Seu provedor de identidade não redirecionou de volta para seu redirectUri.

Importante: se o aplicativo usar uma biblioteca de roteadores (por exemplo, Roteador React, Roteador Angular), verifique se ele não remove o hash ou o redirecionamento automático enquanto a aquisição do token MSAL está em andamento. Se possível, será melhor se sua redirectUri página não invocar o roteador.

Problemas causados pela página redirectUri

Quando você fizer uma chamada silenciosa, em alguns casos, um iframe será aberto e navegará até a página de autorização do provedor de identidade. Depois que o provedor de identidade autorizar o usuário, ele redirecionará o iframe de volta para o redirectUri com o código de autorização ou informações de erro no fragmento de hash. A instância MSAL em execução no quadro ou janela que fez a solicitação originalmente extrairá esse hash de resposta e a processará. Se o seu redirectUri estiver removendo ou manipulando esse hash, ou navegando para outra página antes que a MSAL o tenha extraído, você receberá esse erro de tempo limite.

✔️ Para resolver esse problema, você deve garantir que a página que você usa como redirectUri não faça nenhuma dessas coisas, pelo menos ao ser carregada em um pop-up ou em um iframe. Recomendamos usar uma página em branco como seu redirectUri para fluxos silenciosos e de pop-up, para garantir que nenhuma dessas situações possa ocorrer.

Você pode fazer isso por solicitação, por exemplo:

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

Lembre-se de que você precisará registrar este novo redirectUri no Registro do seu Aplicativo.

Observações sobre Angular e React:

  • Se você estiver usando @azure/msal-angular, sua redirectUri página não deverá ser protegida pelo MsalGuard.
  • Se você estiver usando @azure/msal-react, sua página redirectUri não deve renderizar o MsalAuthenticationComponent nem usar o hook useMsalAuthentication.

Problemas causados pelo Provedor de Identidade

Throttling

Um dos motivos mais comuns que esse erro pode ser gerado é que seu aplicativo ficou preso em um loop ou fez muitas solicitações de token em um curto período de tempo. Quando isso acontece, o provedor de identidade pode limitar as solicitações subsequentes por um curto período, o que resultará na não redireção de volta para seu redirectUri e, consequentemente, neste erro.

✔️ Para resolver problemas de limitação de taxa, você tem duas opções:

  1. Pare de fazer solicitações por um curto período de tempo antes de tentar novamente.
  2. Invocar uma API interativa, como acquireTokenPopup ou acquireTokenRedirect.
X-Frame-Options Deny

Você também poderá receber esse erro se o Provedor de Identidade falhar ao redirecionar de volta para seu aplicativo. Em cenários silenciosos, esse erro às vezes é acompanhado do erro X-Frame-Options: Deny, indicando que seu provedor de identidade está tentando exibir uma mensagem de erro ou está aguardando interação.

✔️ O erro X-Frame-Options geralmente inclui uma URL, e abrir essa URL em uma nova guia pode ajudá-lo a entender o que está acontecendo. Se a interação for necessária, considere o uso de uma API interativa. Se um erro estiver sendo exibido, resolva o erro.

Espera-se que alguns fluxos B2C gerem esse erro devido à necessidade de interação do usuário. Esses fluxos incluem:

  • Redefinição de senha
  • Edição de perfil
  • Inscrever-se
  • Algumas políticas personalizadas dependendo de como elas são configuradas
Latência de rede

Outro possível motivo pelo qual o provedor de identidade pode não redirecionar de volta para seu aplicativo a tempo pode ser que haja alguma latência de rede extra.

✔️ O tempo limite padrão é de cerca de 10 segundos e deve ser suficiente na maioria dos casos; no entanto, caso o provedor de identidade esteja demorando mais do que isso para redirecionar você, é possível aumentar esse tempo limite na configuração do MSAL com qualquer um dos parâmetros de configuração iframeHashTimeout, windowHashTimeout ou 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

Mensagens de erro:

O valor de hash não pode ser processado porque está vazio. Verifique se o seu redirectUri não está limpando o hash.

Esse erro ocorre quando a página que você usa como seu redirectUri está removendo o hash ou redirecionando automaticamente para outra página. Isso geralmente acontece quando o aplicativo implementa um roteador que navega para outra rota, soltando o hash.

Para resolver esse erro, recomendamos usar uma página de redirectUri dedicada que não está sujeita ao roteador. Para chamadas silenciosas e pop-up, é melhor usar uma página em branco. Se isso não for possível, verifique se o roteador não navega enquanto a aquisição de token MSAL está em andamento. Você pode fazer isso detectando se seu aplicativo está carregado em um iframe para chamadas silenciosas, em um pop-up para chamadas pop-up ou aguardando handleRedirectPromise para chamadas de redirecionamento.

hash_não_contém_propriedades_conhecidas

Mensagens de erro:

O hash não contém propriedades conhecidas. Verifique se o seu redirectUri não está alterando o hash.

Confira a explicação para hash_empty_error acima. A causa raiz desse erro é semelhante, a diferença é que o hash foi alterado, em vez de descartado.

unable_to_acquire_token_from_native_platform

Mensagens de erro:

  • Não é possível adquirir o token da plataforma nativa.

Esse erro é gerado ao chamar a API acquireTokenByCode com nativeAccountId em vez de code, quando o aplicativo está em execução em um ambiente que não adquire tokens do broker nativo. Para obter uma lista de pré-requisitos, examine o documento sobre tokens associados ao dispositivo.

conexão nativa não estabelecida

Mensagens de erro:

  • A conexão com a plataforma nativa não foi estabelecida. Instale uma extensão de navegador compatível e execute initialize().

Esse erro é gerado quando o usuário entra com o agente nativo, mas não há nenhuma conexão com o agente nativo no momento. Isso pode ocorrer pelos seguintes motivos:

  • A extensão contas Windows foi desinstalada ou desabilitada
  • A initialize API não foi chamada ou não foi aguardada antes de invocar outra API MSAL

uninitialized_public_client_application

Mensagens de erro:

  • Você deve chamar e aguardar a função de inicialização antes de tentar chamar qualquer outra API MSAL.

Esse erro é gerado quando a API login, acquireToken ou handleRedirectPromise é invocada antes que a API initialize tenha sido chamada. A initialize API deve ser chamada e aguardada antes de tentar adquirir tokens.

❌ O exemplo a seguir gerará esse erro porque handleRedirectPromise é chamado antes da conclusão da inicialização:

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

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

✔️ Para resolver, você deve esperar que initialize seja concluído antes de chamar qualquer outra API do 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

Erros não gerados por msal, como erros de servidor

O acesso à busca em [url] foi bloqueado pela política do CORS

Esse erro ocorre com MSAL.js v2.x e se deve à configuração inadequada durante o Registro de Aplicativo no portal do Azure. Em particular, você deve garantir que seu redirectUri esteja registrado como tipo: Single-page application na seção Autenticação do registro do aplicativo. Se tudo der certo, você verá uma marca de verificação verde com a mensagem:

Seu URI de redirecionamento é elegível para o fluxo de código de autorização com PKCE.

image