Errors

BrowserConfigurationAuthErrors

stubbed_public_client_application_called

Mensaje de error: Se ha llamado a una instancia stub de la aplicación cliente pública. Si utilizas msal-react, asegúrate de que no se utilice context sin un proveedor.

Consulte errores de msal-react

BrowserAuthErrors

Interacción_en_curso

Mensaje de error: La interacción está actualmente en curso. Asegúrese de que esta interacción se ha completado antes de llamar a una API interactiva.

Este error se produce cuando se invoca una API interactiva (loginPopup, loginRedirect, acquireTokenPopup, acquireTokenRedirect) mientras que otra API interactiva sigue en curso. Las API de inicio de sesión y acquireToken son asíncronas, por lo que deberá asegurarse de que las promesas resultantes se resuelvan antes de invocar otra API.

Usar loginPopup o acquireTokenPopup

Asegúrese de que la promesa devuelta por estas API se haya resuelto antes de invocar otra API.

❌ El siguiente ejemplo provocará este error porque loginPopup seguirá ejecutándose cuando se llame a acquireTokenPopup:

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

✔️ Para resolverlo, debe asegurarse de que todas las API interactivas se hayan resuelto antes de invocar otra:

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

Usar loginRedirect o acquireTokenRedirect

Al usar las API de redirección, handleRedirectPromise debe invocarse al regresar de la redirección. Esto garantiza que la respuesta del token del servidor se controle correctamente y se limpien las entradas de caché temporal. Este error se produce cuando handleRedirectPromise no ha tenido la oportunidad de completarse antes de que la aplicación invoque loginRedirect o acquireTokenRedirect.

❌ En el ejemplo siguiente se producirá este error porque handleRedirectPromise seguirá procesando la respuesta de una llamada anterior loginRedirect cuando loginRedirect se llame a una segunda vez:

msalInstance.handleRedirectPromise();

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

✔️ Para resolverlo, debe esperar a que handleRedirectPromise se resuelva antes de llamar a cualquier API interactiva:

await msalInstance.handleRedirectPromise();

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

O 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: Si llama a loginRedirect o acquireTokenRedirect desde una página que no es su redirectUri, deberá asegurarse de llamar a handleRedirectPromise y esperarlo tanto en la página redirectUri como en la página desde la que inició la redirección. Esto se debe a que la página redirectUri iniciará una redirección de vuelta a la página que invocó originalmente loginRedirect y esa página procesará la respuesta del token.

Bibliotecas envolventes

Si usa una de nuestras bibliotecas contenedoras (React o Angular), consulte los documentos de error de esas bibliotecas específicas por motivos adicionales por los que puede recibir este error:

Si no usa ninguna de las bibliotecas contenedoras, pero le preocupa que la aplicación pueda desencadenar solicitudes interactivas simultáneas, debe comprobar si alguna otra interacción está en curso antes de invocar una interacción en el método de adquisición de tokens. Para lograrlo, implemente un estado de aplicación global o un servicio de difusión, etc. que emita el estado actual de interacción de MSAL a través de la API de eventos de MSAL.

❌ En el ejemplo siguiente se producirá este error porque en acquireTokenPopup el bloque catch no se comprueba si se produce otra interacción en este 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 resolverlo, debe esperar a que el estado de interacción sea None antes de llamar a cualquier otra API interactiva:

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

Pasos para solucionar problemas

  • Habilite el registro detallado y realice un seguimiento del orden de los eventos. Comprueba que se llame a handleRedirectPromise y que este devuelva un valor antes de llamar a cualquier API login o acquireToken.

Si no puede averiguar por qué se produce este error, abra un problema y prepárese para compartir la siguiente información:

  • Registros detallados
  • Una aplicación de ejemplo o fragmentos de código que podemos usar para reproducir el problema
  • Actualice la página. ¿El error desaparece?
  • Abra la aplicación en una pestaña nueva. ¿El error desaparece?

block_iframe_reload

Mensaje de error: La solicitud se bloqueó dentro de un iframe porque MSAL detectó una respuesta de autenticación.

Este error se produce al llamar a ssoSilent o acquireTokenSilent y la página utilizada como redirectUri está intentando invocar una función de inicio de sesión o acquireToken. Nuestra mitigación recomendada para ello es configurar redirectUri como una página en blanco que no implemente MSAL al invocar API en modo silencioso. Esto también tendrá la ventaja adicional de mejorar el rendimiento, ya que el iframe oculto no necesita representar la página.

✔️ Puede hacerlo por solicitud, por ejemplo:

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

Recuerde que tendrá que registrar este nuevo redirectUri en el registro de aplicaciones.

Si no desea usar un redirectUri específico para este fin, debe asegurarse de que su redirectUri no intente invocar las API de MSAL cuando se represente dentro del iframe oculto que utilizan las API silenciosas.

monitor_window_timeout

Mensajes de error:

  • La adquisición del token en el iframe ha fallado debido a un tiempo de espera agotado.

Este error se puede producir al llamar a ssoSilent, acquireTokenSilentacquireTokenPopup o loginPopup y hay varias razones por las que esto podría ocurrir. Estos son algunos de los más comunes:

  1. La página que utilizas como redirectUri está eliminando o manipulando el hash.
  2. La página que utiliza como redirectUri redirige automáticamente a otra página
  3. Tu proveedor de identidad te está limitando el tráfico.
  4. Tu proveedor de identidad no te ha redirigido de vuelta a tu redirectUri.

Importante: Si su aplicación usa una biblioteca de enrutamiento (p. ej., React Router, Angular Router), asegúrese de que no elimine el hash ni redirija automáticamente mientras la obtención de tokens de MSAL esté en curso. Si es posible, lo mejor es que la página redirectUri no invoque el enrutador en absoluto.

Problemas causados por la página redirectUri

Cuando realice una solicitud silenciosa, en algunos casos se abrirá un iframe y se dirigirá a la página de autorización de su proveedor de identidad. Una vez que el proveedor de identidades haya autorizado al usuario, redirigirá el iframe de vuelta a redirectUri con el código de autorización o la información del error en el fragmento hash. La instancia de MSAL que se ejecuta en el marco o ventana que originalmente realizó la solicitud extraerá este hash de respuesta y lo procesará. redirectUri Si quita o manipula este hash o navega a una página diferente antes de que MSAL lo haya extraído, recibirá este error de tiempo de espera.

✔️ Para solucionar este problema, debería asegurarse de que la página que utiliza como redirectUri no haga ninguna de estas cosas, al menos cuando se carga en una ventana emergente o en un iframe. Recomendamos usar una página en blanco como redirectUri para los flujos silenciosos y con ventanas emergentes, a fin de garantizar que no pueda ocurrir ninguna de estas cosas.

Puede hacerlo por solicitud, por ejemplo:

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

Recuerde que tendrá que registrar este nuevo redirectUri en el registro de aplicaciones.

Notas sobre Angular y React:

  • Si utiliza @azure/msal-angular, su página redirectUri no debería estar protegida por MsalGuard.
  • Si usa @azure/msal-react, la página redirectUri no debe renderizar MsalAuthenticationComponent ni usar el hook useMsalAuthentication.

Problemas causados por el proveedor de identidades

Throttling

Una de las razones más comunes por las que se puede producir este error es que la aplicación se ha bloqueado en un bucle o ha realizado demasiadas solicitudes de token en un breve período de tiempo. Cuando esto ocurre, el proveedor de identidad puede limitar las solicitudes posteriores durante un breve periodo de tiempo, lo que provocará que no se te redirija de nuevo a tu redirectUri y, en última instancia, este error.

✔️ Para resolver los problemas relacionados con la limitación, tienes dos opciones:

  1. Deje de realizar solicitudes durante un breve tiempo antes de intentarlo de nuevo.
  2. Invoque una API interactiva, como acquireTokenPopup o acquireTokenRedirect.
X-Frame-Options Deny

También puede aparecer este error si el proveedor de identidad no consigue redirigir de vuelta a su aplicación. En escenarios silenciosos, este error a veces va acompañado de un error X-Frame-Options: Deny, que indica que su proveedor de identidades está intentando mostrarle un mensaje de error o que requiere interacción.

✔️ El error X-Frame-Options normalmente tendrá una dirección URL en ella y abrir esta dirección URL en una nueva pestaña puede ayudarle a distinguir lo que sucede. Si se requiere interacción, considere la posibilidad de usar una API interactiva en su lugar. Si se muestra un error, solucione el error.

Se espera que algunos flujos B2C produzcan este error debido a su necesidad de interacción del usuario. Estos flujos incluyen:

  • Restablecimiento de contraseña
  • Edición de perfil
  • Registrarse
  • Algunas directivas personalizadas en función de cómo se configuran
Latencia de red

Otra posible razón por la que el proveedor de identidad puede no volver a redirigir a su aplicación a tiempo es que haya una latencia de red adicional.

✔️ El tiempo de espera predeterminado es de aproximadamente 10 segundos y debería ser suficiente en la mayoría de los casos; sin embargo, si su proveedor de identidad tarda más de ese tiempo en redirigirle, puede aumentar este tiempo de espera en la configuración de MSAL mediante los parámetros de configuración iframeHashTimeout, windowHashTimeout o 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

Mensajes de error:

No se puede procesar el valor hash porque está vacío. Comprueba que tu redirectUri no esté borrando el hash.

Este error se produce cuando la página que utilizas como redirectUri elimina el hash o redirige automáticamente a otra página. Esto suele ocurrir cuando la aplicación implementa un enrutador que navega a otra ruta, quitando el hash.

Para resolver este error, se recomienda usar una página redirectUri dedicada que no está sujeta al enrutador. Para llamadas emergentes y silenciosas, es mejor usar una página en blanco. Si esto no es posible, asegúrese de que el enrutador no navega mientras la adquisición de tokens de MSAL está en curso. Para ello, puedes detectar si tu aplicación se carga en un iframe para llamadas silenciosas, en una ventana emergente para llamadas emergentes o esperando a handleRedirectPromise para las llamadas de redirección.

el hash no contiene propiedades conocidas

Mensajes de error:

El hash no contiene propiedades conocidas. Verifique que su redirectUri no modifica el hash.

Consulte la explicación de hash_empty_error anterior. La causa raíz de este error es similar, con la diferencia de que el hash se ha cambiado en lugar de eliminarse.

no se puede adquirir el token de la plataforma nativa

Mensajes de error:

  • No se puede obtener el token de la plataforma nativa.

Este error se produce al llamar a la acquireTokenByCode API con nativeAccountId en lugar de code y la aplicación se ejecuta en un entorno que no adquiere tokens del agente nativo. Para obtener una lista de los requisitos previos, revise el documento sobre los tokens enlazados al dispositivo.

conexion_nativa_no_establecida

Mensajes de error:

  • No se ha establecido la conexión a la plataforma nativa. Instale una extensión del explorador compatible y ejecute initialize().

Este error se produce cuando el usuario inició sesión con el agente nativo, pero actualmente no existe ninguna conexión con el agente nativo. Esto puede deberse a los siguientes motivos:

  • La extensión de Cuentas de Windows se ha desinstalado o deshabilitado
  • No se ha llamado a la API initialize o no se ha esperado a que finalizara antes de invocar otra API de MSAL.

aplicacion_cliente_publica_sin_inicializar

Mensajes de error:

  • Debes llamar a la función `initialize` y esperar a que se ejecute antes de intentar llamar a cualquier otra API de MSAL.

Este error se produce cuando se invoca una API login, acquireToken o handleRedirectPromise antes de que se haya llamado a la API initialize. Se debe llamar a la initialize API y esperar antes de intentar adquirir tokens.

❌ En el ejemplo siguiente se producirá este error porque handleRedirectPromise se llama antes de que se haya completado la inicialización:

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 solucionarlo, debe esperar a que initialize se resuelva antes de llamar a cualquier otra API de 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

Otros

Errores no producidos por msal, como errores de servidor

Se ha bloqueado el acceso a fetch en [url] por la política de CORS

Este error se produce con MSAL.js v2.x y se debe a una configuración incorrecta durante el registro de aplicaciones en Azure Portal. En concreto, debe asegurarse de que su redirectUri se haya registrado como del tipo: Single-page application en la sección Autenticación de su Registro de aplicaciones. Si se ha realizado correctamente, verá una marca de verificación verde que dice:

Tu URI de redirección cumple los requisitos para el flujo de código de autorización con PKCE.

imagen