Persistencia del estado de autenticación

Puedes especificar cómo persiste el estado de autenticación cuando se usa el SDK de Firebase JS. Esto incluye la posibilidad de especificar si un usuario conectado debe mantenerse así indefinidamente hasta que salga de la sesión, debe desactivarse cuando se cierra la ventana o cuando se actualiza la página.

En el caso de una aplicación web, el comportamiento predeterminado es el de mantener la sesión de un usuario incluso después de que el usuario cierra el navegador. Esto resulta conveniente porque el usuario no se ve forzado a acceder a su cuenta cada vez que visita la página web en el mismo dispositivo. El proceso de acceder a su cuenta podría implicar que vuelva a ingresar su contraseña, que se le envíe una verificación por SMS, etc., lo que podría obstaculizar la experiencia del usuario.

Sin embargo, hay casos en los que este comportamiento puede no ser el ideal:

  • En apps que manejan datos confidenciales, podría resultar conveniente borrar el estado cuando se cierra la ventana o la pestaña. Esto es importante en caso de que el usuario se olvide de salir de su cuenta.
  • Aplicaciones que se usan en un dispositivo compartido por varios usuarios. Un ejemplo común es una app que se ejecute en la computadora de una biblioteca.
  • Una aplicación en un dispositivo compartido al que pueden acceder varios usuarios. El desarrollador no tiene forma de saber cómo se accede a esa app y podría ser conveniente darles a los usuarios la opción de mantener la sesión abierta o no. Para ello, puede agregarse la opción "Recordarme" en el acceso.
  • En algunas situaciones, es posible que el desarrollador desee que la sesión de un usuario anónimo no persista hasta que el usuario se actualice a una cuenta no anónima (federada, con contraseña, teléfono, etc.).
  • El desarrollador puede querer brindar la posibilidad de que diferentes usuarios accedan a una app en diferentes pestañas. El comportamiento predeterminado es mantener el mismo estado en distintas pestañas de un mismo origen.

Como se indicó anteriormente, hay diversas situaciones en las que es mejor anular la persistencia permanente predeterminada.

Tipos de persistencia admitidos para el estado de autenticación

Puedes elegir uno de los tres tipos de persistencia para el estado de autenticación de una instancia Firebase Auth específica en función de los requisitos del usuario o de tu aplicación.

Enum Valor Descripción
firebase.auth.Auth.Persistence.LOCAL "local" Indica que el estado persistirá incluso cuando se cierre la ventana del navegador o se anule la actividad en React Native. Se debe salir de la cuenta de forma explícita para desactivar ese estado. Ten en cuenta que las sesiones web de Firebase Auth son el único origen del host y persistirán para un solo dominio.
firebase.auth.Auth.Persistence.SESSION "session" Indica que el estado solo persistirá en la sesión o pestaña actual y se desactivará cuando se cierre la pestaña o ventana en la que el usuario está autenticado. Solo se aplica a las apps web.
firebase.auth.Auth.Persistence.NONE "none" Indica que el estado solo se guardará en memoria y se desactivará cuando se actualicen la ventana o la actividad.

Modificación de la persistencia del estado de autenticación

Puedes especificar o modificar el tipo de persistencia existente mediante una llamada al método firebase.auth().setPersistence:

API modular web

import { getAuth, setPersistence, signInWithEmailAndPassword, browserSessionPersistence } from "firebase/auth";

const auth = getAuth();
setPersistence(auth, browserSessionPersistence)
  .then(() => {
    // Existing and future Auth states are now persisted in the current
    // session only. Closing the window would clear any existing state even
    // if a user forgets to sign out.
    // ...
    // New sign-in will be persisted with session persistence.
    return signInWithEmailAndPassword(auth, email, password);
  })
  .catch((error) => {
    // Handle Errors here.
    const errorCode = error.code;
    const errorMessage = error.message;
  });

API con espacio de nombres web

firebase.auth().setPersistence(firebase.auth.Auth.Persistence.SESSION)
  .then(() => {
    // Existing and future Auth states are now persisted in the current
    // session only. Closing the window would clear any existing state even
    // if a user forgets to sign out.
    // ...
    // New sign-in will be persisted with session persistence.
    return firebase.auth().signInWithEmailAndPassword(email, password);
  })
  .catch((error) => {
    // Handle Errors here.
    var errorCode = error.code;
    var errorMessage = error.message;
  });

Esto cambiará el tipo de persistencia en la instancia de Auth especificada para la sesión de Auth guardada actualmente y aplicará ese tipo de persistencia a las futuras solicitudes de acceso, incluido el acceso con solicitudes de redireccionamiento. Además, devolverá una promesa que se resolverá una vez que el estado termine de copiarse de un tipo de almacenamiento a otro. Si llamas a un método de acceso después de cambiar la persistencia, se esperará a que el cambio de persistencia finalice antes de aplicarlo al nuevo estado de autenticación.

El valor predeterminado para el navegador web y las apps React Native es local (siempre que el navegador sea compatible con este mecanismo de almacenamiento, p. ej., las cookies o los datos de terceros deben estar habilitados), mientras que es none para las apps de backend de Node.js.

Descripción general del comportamiento de la persistencia

Se usan los siguientes criterios para determinar el estado actual de la persistencia.

  • Inicialmente, el SDK comprobará si existe un usuario autenticado. A menos que se llame a setPersistence, el tipo de persistencia actual de ese usuario se aplicará en intentos de acceso futuros. Por lo tanto, si la sesión de ese usuario persistió en session en una página web anterior y se visitó una página nueva, cuando vuelva a acceder con otro usuario también se guardará el estado de ese usuario con una persistencia de tipo session.
  • Si no hay ningún usuario conectado y no se especificó ninguna persistencia, se aplicará la configuración predeterminada (local en una app de navegador).
  • Si no hay ningún usuario conectado y se configura un nuevo tipo de persistencia, cualquier intento de acceso futuro usará ese tipo de persistencia.
  • Si el usuario está conectado y se modifica el tipo de persistencia, se cambiará la persistencia de ese usuario conectado al nuevo tipo. Todos los intentos de acceso futuros usarán esa nueva persistencia.
  • Cuando se llama a signInWithRedirect, el tipo de persistencia actual se conserva y se aplica al final del flujo de OAuth para el usuario conectado, incluso si la persistencia era de tipo none. Si la persistencia del estado de autenticación se especifica de forma explícita en esa página, se anulará la persistencia de la página anterior que inició el flujo de redireccionamiento.

    API modular web

    import { getAuth, setPersistence, signInWithRedirect, inMemoryPersistence, GoogleAuthProvider } from "firebase/auth";
    
    const auth = getAuth();
    setPersistence(auth, inMemoryPersistence)
      .then(() => {
        const provider = new GoogleAuthProvider();
        // In memory persistence will be applied to the signed in Google user
        // even though the persistence was set to 'none' and a page redirect
        // occurred.
        return signInWithRedirect(auth, provider);
      })
      .catch((error) => {
        // Handle Errors here.
        const errorCode = error.code;
        const errorMessage = error.message;
      });

    API con espacio de nombres web

    firebase.auth().setPersistence(firebase.auth.Auth.Persistence.NONE)
      .then(() => {
        var provider = new firebase.auth.GoogleAuthProvider();
        // In memory persistence will be applied to the signed in Google user
        // even though the persistence was set to 'none' and a page redirect
        // occurred.
        return firebase.auth().signInWithRedirect(provider);
      })
      .catch((error) => {
        // Handle Errors here.
        var errorCode = error.code;
        var errorMessage = error.message;
      });

Comportamiento esperado en las pestañas del navegador

El siguiente comportamiento se aplicará cuando se usen diferentes tipos de persistencia en distintas pestañas. El requisito es que en ningún momento haya varios tipos de estado guardados simultáneamente (p. ej., un estado de autenticación guardado con un tipo de almacenamiento session y otro local):

  • Los usuarios pueden acceder con persistencia session o none con diferentes usuarios en varias pestañas. Cada pestaña no puede ver el estado de la otra pestaña.
  • Cualquier intento de acceder con persistencia local se detectará y sincronizará en todas las pestañas. Si el usuario ya estaba conectado en una pestaña específica con persistencia session o none, se borrará ese estado.
  • Si el usuario estaba conectado con persistencia local con varias pestañas abiertas y después cambia a una persistencia none o session en una pestaña, el estado de esa pestaña se modificará para el usuario con persistencia session o none. En todas las demás pestañas, se saldrá de la sesión del usuario.