Errors

BrowserConfigurationAuthErrors

stubbed_public_client_application_called

Mensagem de erro: Foi chamada uma instância stub da Aplicação Cliente Pública. Se estiver a usar msal-react, por favor assegure que o contexto não é usado sem um fornecedor.

Ver erros do msal-react

BrowserAuthErrors

Interação_em_curso

Mensagem de Erro: A interação está atualmente em andamento. Por favor, certifique-se de que esta interação foi concluída antes de chamar uma API interativa.

Este erro é lançado quando uma API interativa (loginPopup, loginRedirect, acquireTokenPopup, acquireTokenRedirect) é invocada enquanto outra API interativa ainda está em andamento. As APIs login e acquireToken são assíncronas, pelo que terá de garantir que as promessas resultantes tenham sido resolvidas antes de invocar outra API.

Usando loginPopup ou acquireTokenPopup

Certifique-se de que a promessa devolvida destas APIs foi resolvida antes de invocar outra.

❌ O exemplo seguinte irá gerar este erro porque loginPopup ainda estará em curso quando acquireTokenPopup for chamado:

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

✔️ Para resolver isto, deve garantir que todas as APIs interativas foram 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 regressar do redirecionamento. Isto garante que a resposta do token do servidor é devidamente tratada e que as entradas temporárias de cache são limpas. Este erro é gerado quando handleRedirectPromise ainda não teve oportunidade de ser concluído antes de a aplicação invocar loginRedirect ou acquireTokenRedirect.

❌ O exemplo seguinte gerará este erro porque handleRedirectPromise continuará a processar a resposta de uma chamada anterior loginRedirect quando loginRedirect for chamada pela segunda vez:

msalInstance.handleRedirectPromise();

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

✔️ Para o resolver, deve aguardar que handleRedirectPromise seja resolvido antes de chamar qualquer API interativa:

await msalInstance.handleRedirectPromise();

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

Ou, alternativamente:

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 estiver a chamar loginRedirect ou acquireTokenRedirect a partir de uma página que não seja a sua redirectUri, terá de garantir que handleRedirectPromise é chamado e aguardado tanto na página redirectUri como na página a partir da qual iniciou o redirecionamento. Isto acontece porque a página redirectUri iniciará um redirecionamento de volta à página que invocou originalmente loginRedirect e essa página processará a resposta do token.

Bibliotecas de Wrapper

Se estiver a usar uma das nossas bibliotecas de wrappers (React ou Angular), por favor consulte a documentação de erro nessas bibliotecas específicas por razões adicionais pelas quais pode estar a receber este erro:

Se não estiver a usar nenhuma das bibliotecas de wrappers mas estiver preocupado que a sua aplicação possa desencadear pedidos interativos simultâneos, deve verificar se há alguma outra interação em curso antes de invocar uma interação no seu método de aquisição de tokens. Pode conseguir isto implementando um estado global de aplicação ou um serviço de broadcast, etc., que emita o estado atual de interação MSAL através da API de Eventos MSAL.

❌ O exemplo seguinte irá gerar este erro porque o bloco acquireTokenPopup no catch block não verifica se há outra interação a ocorrer 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, deve esperar pelo estado None da interação 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());

Passos de Resolução de Problemas

  • Ative o registo detalhado e trace a ordem dos eventos. Verifique que handleRedirectPromise é chamado e retorna antes de qualquer API login ou acquireToken ser chamada.

Se não conseguir perceber porque é que este erro está a ser lançado, por favor abra uma consulta e esteja preparado para partilhar a seguinte informação:

  • Registos verbosos
  • Uma aplicação de exemplo e/ou excertos de código que possamos usar para reproduzir o problema
  • Atualize a página. O erro desaparece?
  • Abra a sua aplicação num novo separador. O erro desapareceu?

block_iframe_reload

Mensagem de erro: O pedido foi bloqueado dentro de um iframe porque o MSAL detetou uma resposta de autenticação.

Este erro é gerado ao chamar ssoSilent ou acquireTokenSilent quando a página usada como redirectUri está a tentar invocar uma função de início de sessão ou acquireToken. A nossa medida de mitigação recomendada para isto é definir o redirectUri como uma página em branco que não implemente o MSAL ao invocar APIs em modo silencioso. Isto também terá o benefício adicional de melhorar o desempenho, pois o iframe oculto não precisa de renderizar a sua página.

✔️ Pode fazer isto por pedido, por exemplo:

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

Lembre-se de que terá de registar este novo redirectUri no Registo da Aplicação.

Se não quiser usar um redirectUri dedicado para esta finalidade, deve, em vez disso, garantir que o seu redirectUri não está a tentar chamar APIs MSAL quando é processado dentro do iframe oculto utilizado pelas APIs silenciosas.

monitorizar_janela_tempo_limite

Mensagens de Erro:

  • A aquisição do token no iframe falhou devido ao timeout.

Este erro pode ocorrer ao chamar ssoSilent, acquireTokenSilent, acquireTokenPopup ou loginPopup e existem várias razões para que isso aconteça. Estes são alguns dos mais comuns:

  1. A página que utilizas como redirectUri está a remover ou a manipular o hash
  2. A página que usas como tua redirectUri navega automaticamente para outra página
  3. Está a ser limitado pelo seu fornecedor de identidade
  4. O seu fornecedor de identidade não o redirecionou novamente para o seu redirectUri.

Importante: Se a sua aplicação utiliza uma biblioteca de router (por exemplo, React Router, Angular Router), por favor certifique-se de que não remove o hash nem faz auto-redirecionamento enquanto a aquisição de tokens MSAL está em curso. Se possível, é melhor que a sua redirectUri página não invoque o router de todo.

Problemas causados pela página redirectUri

Quando faz uma chamada silenciosa, em alguns casos, um iframe será aberto e irá aceder à página de autorização do seu fornecedor de identidade. Depois de o fornecedor de identidade ter autorizado o utilizador, irá redirecionar o iframe de volta para o redirectUri com o código de autorização ou informação de erro no fragmento de hash. A instância do MSAL em execução no frame ou na janela que originalmente efetuou o pedido irá extrair este hash da resposta e processá-lo. Se redirectUri estiver a remover ou manipular este hash ou a navegar para outra página antes do MSAL o extrair, receberá este erro de timeout.

✔️ Para resolver este problema, deve garantir que a página que usa como seu redirectUri não está a fazer nenhuma destas coisas, pelo menos, quando carregada num popup ou iframe. Recomendamos utilizar uma página em branco como redirectUri nos fluxos silenciosos e de pop-up para garantir que nenhuma destas situações possa ocorrer.

Pode fazer isto por pedido, por exemplo:

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

Lembre-se de que terá de registar este novo redirectUri no Registo da Aplicação.

Notas sobre Angular e React:

  • Se estiver a usar @azure/msal-angular, a sua página redirectUri não deve estar protegida pelo MsalGuard.
  • Se estiveres a usar @azure/msal-react, a tua página redirectUri não deve renderizar o MsalAuthenticationComponent nem usar o hook useMsalAuthentication.

Problemas causados pelo Fornecedor de Identidade

Throttling

Uma das razões mais comuns para este erro é que a sua aplicação ficou presa num ciclo ou fez demasiados pedidos de token num curto espaço de tempo. Quando isto acontece, o fornecedor de identidade pode limitar temporariamente os pedidos subsequentes, o que fará com que não seja redirecionado de volta para o seu redirectUri e, em última instância, cause este erro.

✔️ Para resolver problemas de limitação tens duas opções:

  1. Pare de fazer pedidos por um curto período antes de tentar novamente.
  2. Invocar uma API interativa, como acquireTokenPopup ou acquireTokenRedirect.
X-Frame-Options Negar

Também pode receber este erro se o Fornecedor de Identidade não redirecionar de volta para a sua aplicação. Em cenários silenciosos, este erro é por vezes acompanhado por um erro X-Frame-Options: Deny, indicando que o seu fornecedor de identidade está a tentar apresentar-lhe uma mensagem de erro ou que está à espera de uma interação.

✔️ O erro X-Frame-Options normalmente tem uma URL e abrir essa URL numa nova aba pode ajudar-te a perceber o que está a acontecer. Se for necessária interação, considere usar uma API interativa. Se estiver a ser exibido um erro, corrige-o.

Espera-se que alguns fluxos B2C gerem este erro devido à necessidade de interação com o utilizador. Estes fluxos incluem:

  • Redefinição de senha
  • Editar perfil
  • Inscrever-se
  • Algumas políticas personalizadas dependendo de como estão configuradas
Latência na Rede

Outra possível razão pela qual o fornecedor de identidade pode não redirecionar de volta para a sua aplicação a tempo pode ser a existência de alguma latência adicional na rede.

✔️ O timeout predefinido é de aproximadamente 10 segundos e deverá ser suficiente na maioria dos casos; no entanto, se o seu fornecedor de identidade demorar mais do que isso a redirecioná-lo, pode aumentar este timeout 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. Por favor, verifique se o seu redirectUri não elimina o hash.

Este erro ocorre quando a página que usa como redirecionador Uri está a remover o hash ou a redirecionar automaticamente para outra página. Isto acontece mais frequentemente quando a aplicação implementa um router que navega para outra rota, eliminando o hash.

Para resolver este erro, recomendamos usar uma página dedicada de redirectionUri que não está sujeita ao router. Para chamadas silenciosas e pop-up, o melhor é usar uma página em branco. Se isso não for possível, por favor certifique-se de que o router não navega enquanto a aquisição de tokens MSAL está em curso. Pode fazer isto detetando se a sua aplicação está carregada num iframe para chamadas silenciosas, num popup para chamadas popup ou aguardando handleRedirectPromise chamadas de redirecionamento.

hash_não_contém_propriedades_conhecidas

Mensagens de Erro:

O hash não contém propriedades conhecidas. Por favor, verifica se o teu redirectionUri não está a alterar o hash.

Por favor, veja a explicação de hash_empty_error acima. A causa raiz deste erro é semelhante, a diferença é que o hash foi alterado, em vez de eliminado.

incapaz_de_adquirir_token_da_plataforma_nativa

Mensagens de Erro:

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

Este erro é gerado ao chamar a API acquireTokenByCode com o nativeAccountId em vez de code, e a aplicação está em execução num ambiente que não obtém tokens do broker nativo. Para uma lista de pré-requisitos, por favor consulte a documentação sobre tokens vinculados ao dispositivo.

ligação nativa não estabelecida

Mensagens de Erro:

  • A ligação à plataforma nativa ainda não foi estabelecida. Por favor, instale uma extensão de navegador compatível e execute initialize().

Este erro é apresentado quando o utilizador iniciou sessão com o broker nativo, mas não existe atualmente ligação ao broker nativo. Isto pode acontecer pelos seguintes motivos:

  • A extensão Windows Accounts foi desinstalada ou desativada
  • 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:

  • Tem de chamar e aguardar a função `initialize` antes de tentar chamar qualquer outra API do MSAL.

Este erro é lançado quando um login, acquireToken ou handleRedirectPromise API é invocado antes de a initialize API ter sido chamada. A initialize API deve ser chamada e aguardada antes de tentar adquirir tokens.

❌ O exemplo seguinte gera este erro porque handleRedirectPromise é chamado antes de a inicialização estar concluída:

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, deve aguardar que initialize seja resolvido antes de chamar qualquer outra 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

Erros não lançados pelo msal, como erros no servidor

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

Este erro ocorre com MSAL.js v2.x e deve-se a uma configuração incorreta durante o Registo de Aplicações no portal do Azure. Em particular, deve garantir que o seu redirectUri está registado como tipo: Single-page application no separador Autenticação no Registo da Aplicação. Se tiver sido concluído com êxito, verá uma marca de verificação verde com a indicação:

O seu URI de Redirecionamento é elegível para o Fluxo de Código de Autorização com PKCE.

image