Persistencia del estado de autenticación

Puede especificar cómo persiste el estado de autenticación cuando se utiliza el SDK de Firebase JS. Esto incluye la capacidad de especificar si un usuario que inició sesión debe persistir indefinidamente hasta que cierre la sesión explícitamente, borrarse cuando se cierra la ventana o borrarse al recargar la página.

Para una aplicación web, el comportamiento predeterminado es conservar la sesión de un usuario incluso después de que el usuario cierre el navegador. Esto es conveniente ya que no es necesario que el usuario inicie sesión continuamente cada vez que visita la página web en el mismo dispositivo. Esto podría requerir que el usuario tenga que volver a ingresar su contraseña, enviar una verificación por SMS, etc., lo que podría agregar mucha fricción a la experiencia del usuario.

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

  • Es posible que las aplicaciones con datos confidenciales deseen borrar el estado cuando la ventana o pestaña está cerrada. Esto es importante en caso de que el usuario olvide cerrar sesión.
  • Aplicaciones que se utilizan en un dispositivo compartido por varios usuarios. Un ejemplo común aquí es una aplicación que se ejecuta en una computadora de la biblioteca.
  • Una aplicación en un dispositivo compartido al que pueden acceder varios usuarios. El desarrollador no puede saber cómo se accede a esa aplicación y es posible que desee brindarle al usuario la posibilidad de elegir si persiste en su sesión o no. Esto se puede hacer agregando la opción "Recordarme" durante el inicio de sesión.
  • En algunas situaciones, es posible que un desarrollador no desee conservar un usuario anónimo hasta que ese usuario se actualice a una cuenta no anónima (federada, contraseña, teléfono, etc.).
  • Es posible que un desarrollador desee permitir que diferentes usuarios inicien sesión en una aplicación en diferentes pestañas. El comportamiento predeterminado es conservar el estado en todas las pestañas para el mismo origen.

Como se indicó anteriormente, existen múltiples situaciones en las que es posible que sea necesario anular la persistencia permanente predeterminada.

Tipos admitidos de persistencia del estado de autenticación

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

enumeración Valor Descripción
firebase.auth.Auth.Persistence.LOCAL 'local' Indica que el estado persistirá incluso cuando se cierre la ventana del navegador o se destruya la actividad en React Native. Se necesita un cierre de sesión explícito para borrar ese estado. Tenga en cuenta que las sesiones web de Firebase Auth tienen un origen de host único y se conservarán para un solo dominio.
firebase.auth.Auth.Persistence.SESSION 'sesión' Indica que el estado solo persistirá en la sesión o pestaña actual y se borrará cuando se cierre la pestaña o ventana en la que se autenticó el usuario. Se aplica solo a aplicaciones web.
firebase.auth.Auth.Persistence.NONE 'ninguno' Indica que el estado solo se almacenará en la memoria y se borrará cuando se actualice la ventana o actividad.

Modificar la persistencia del estado de autenticación

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

Web modular API

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

Web namespaced API

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 autenticación especificada para la sesión de autenticación guardada actualmente y aplicará este tipo de persistencia para futuras solicitudes de inicio de sesión, incluido el inicio de sesión con solicitudes de redireccionamiento. Esto devolverá una promesa que se resolverá una vez que el estado termine de copiar de un tipo de almacenamiento a otro. Llamar a un método de inicio de sesión después de cambiar la persistencia esperará a que se complete el cambio de persistencia antes de aplicarlo en el nuevo estado de autenticación.

El valor predeterminado para el navegador web y las aplicaciones React Native es local (siempre que el navegador admita este mecanismo de almacenamiento, por ejemplo, las cookies/datos de terceros estén habilitados), mientras que no es none para las aplicaciones backend de Node.js.

Descripción general del comportamiento de persistencia

Se aplicarán los siguientes criterios al determinar el estado actual de persistencia.

  • Inicialmente, el SDK comprobará si existe un usuario autenticado. A menos que se llame setPersistence , el tipo de persistencia actual de ese usuario se aplicará para futuros intentos de inicio de sesión. Entonces, si ese usuario mantuvo la session en una página web anterior y se visitó una nueva página, iniciar sesión nuevamente con un usuario diferente dará como resultado que el estado de ese usuario también se guarde con la persistencia session .
  • Si ningún usuario ha iniciado sesión y no se especifica ninguna persistencia, se aplicará la configuración predeterminada ( local en una aplicación de navegador).
  • Si ningún usuario ha iniciado sesión y se establece un nuevo tipo de persistencia, cualquier intento de inicio de sesión futuro utilizará ese tipo de persistencia.
  • Si el usuario ha iniciado sesión y se modifica el tipo de persistencia, ese usuario existente que haya iniciado sesión cambiará la persistencia a una nueva. Todos los futuros intentos de inicio de sesión utilizará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 al usuario que acaba de iniciar sesión, incluso si la persistencia era none . Si la persistencia se especifica explícitamente en esa página, anulará la persistencia del estado de autenticación retenido de la página anterior que inició el flujo de redireccionamiento.

    Web modular API

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

    Web namespaced API

    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 esperado se aplicará cuando se utilicen diferentes tipos de persistencia en diferentes pestañas. El requisito es que en ningún momento debe haber varios tipos de estados guardados al mismo tiempo (por ejemplo, estado de autenticación guardado en session y tipos de almacenamiento local ):

  • Los usuarios pueden iniciar sesión mediante session o none persistencia con diferentes usuarios en varias pestañas. Cada pestaña no puede ver el estado de la otra pestaña.
  • Cualquier intento de iniciar sesión utilizando la persistencia local se detectará y sincronizará en todas las pestañas. Si el usuario inició sesión previamente en una pestaña específica usando session o none persistencia, ese estado se borrará.
  • Si el usuario inició sesión previamente usando persistencia local con varias pestañas abiertas y luego cambia a none o persistencia session en una pestaña, el estado de esa pestaña se modificará con el usuario persistiendo en session o none y en todas las demás pestañas, el usuario se cerrará la sesión.