Persistenza dello stato di autenticazione

Puoi specificare la modalità di persistenza dello stato di autenticazione quando utilizzi l'SDK Firebase JS. Ciò include la possibilità di specificare se un utente che ha eseguito l'accesso deve saranno mantenuti a tempo indeterminato fino all'uscita esplicita, quando la finestra viene chiuso o cancellato al ricaricamento della pagina.

Per un'applicazione web, il comportamento predefinito è mantenere la sessione di un utente anche dopo che l'utente ha chiuso il browser. È una soluzione pratica perché l'utente è necessario effettuare l'accesso continuo ogni volta che si visita la pagina web sullo stesso dispositivo. L'utente potrebbe dover reinserire la password, inviare una verifica via SMS e così via, il che potrebbe complicare notevolmente l'esperienza utente.

Tuttavia, possono verificarsi casi in cui questo comportamento potrebbe non essere ideale:

  • Potrebbe essere opportuno cancellare lo stato delle applicazioni con dati sensibili al momento della finestra o la scheda è chiusa. Questo è importante nel caso in cui l'utente dimentichi di uscire.
  • Applicazioni utilizzate su un dispositivo condiviso da più utenti. Un esempio comune è un'app in esecuzione su un computer di una biblioteca.
  • Un'applicazione su un dispositivo condiviso a cui potrebbero accedere più utenti. Lo sviluppatore non è in grado di stabilire in che modo viene eseguito l'accesso all'applicazione e potrebbe voler offrire all'utente la possibilità di scegliere se mantenere o meno la sessione. A questo scopo, puoi aggiungere un'opzione "Ricordami" durante l'accesso.
  • In alcuni casi, uno sviluppatore potrebbe non voler mantenere un utente anonimo fino a quando non viene eseguito l'upgrade a un account non anonimo (federato, con password, telefono e così via).
  • Uno sviluppatore potrebbe voler consentire a utenti diversi di accedere a un'applicazione su schede diverse. Il comportamento predefinito prevede il mantenimento dello stato tra le schede per la stessa origine.

Come indicato sopra, esistono più situazioni in cui la persistenza permanente predefinita potrebbe dover essere sostituita.

Tipi supportati di persistenza dello stato di autorizzazione

Puoi scegliere uno dei tre tipi di persistenza dello stato di autenticazione su un Istanza Firebase Auth in base ai requisiti dell'applicazione o dell'utente.

Enum Valore Descrizione
firebase.auth.Auth.Persistence.LOCAL 'local' Indica che lo stato verrà mantenuto anche quando la finestra del browser viene chiusa o l'attività viene distrutta in React Native. Per cancellare questo stato è necessaria una disconnessione esplicita. Tieni presente che le sessioni web di Firebase Auth hanno un'origine di host singola e verranno mantenute solo per un singolo dominio.
firebase.auth.Auth.Persistence.SESSION "sessione" Indica che lo stato rimarrà attivo solo nella sessione o nella scheda corrente e verrà cancellato quando la scheda o la finestra in cui l'utente si è autenticato viene chiusa. Si applica solo alle app web.
firebase.auth.Auth.Persistence.NONE 'none' Indica che lo stato verrà memorizzato solo in memoria e verrà cancellato quando la finestra o l'attività viene aggiornata.

Modifica della persistenza dello stato di autorizzazione

Puoi specificare o modificare il tipo di persistenza esistente chiamando il metodo firebase.auth().setPersistence:

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

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

In questo modo, verrà modificato il tipo di persistenza nell'istanza Auth specificata per la sessione Auth attualmente salvata e verrà applicato questo tipo di persistenza per le richieste di accesso future, incluse le richieste di accesso con reindirizzamento. Verrà restituito un valore che verrà risolto al termine della copia dello stato da un tipo di archiviazione all'altro. Se chiami un metodo di accesso dopo aver modificato la persistenza, verrà eseguita l'attesa del completamento della modifica della persistenza prima di applicarla al nuovo stato di autenticazione.

Il valore predefinito per il browser web e le app React Native è local (a condizione che il browser supporta questo meccanismo di archiviazione, ad es. I cookie/dati di terze parti sono attivati) mentre è none per le app di backend Node.js.

Panoramica del comportamento di persistenza

I seguenti criteri verranno applicati per determinare lo stato corrente della persistenza.

  • Inizialmente, l'SDK controllerà se esiste un utente autenticato. A meno che non venga chiamato setPersistence, il tipo di persistenza corrente dell'utente verrà applicato per i futuri tentativi di accesso. Quindi se l'utente è rimasto in session su una pagina web precedente ed è stata visitata una nuova pagina, se accedi di nuovo con un altro utente, lo stato dell'utente verrà anche salvato con persistenza session.
  • Se nessun utente ha eseguito l'accesso e non è specificata alcuna persistenza, verrà applicata l'impostazione predefinita (local in un'app browser).
  • Se nessun utente ha eseguito l'accesso e viene impostato un nuovo tipo di persistenza, qualsiasi tentativo di accesso futuro utilizzerà questo tipo di persistenza.
  • Se l'utente ha eseguito l'accesso e il tipo di persistenza viene modificato, l'utente che ha eseguito l'accesso esistente cambierà la persistenza in quella nuova. Tutti i tentativi di accesso futuri utilizzeranno questa nuova persistenza.
  • Quando viene chiamato signInWithRedirect, il tipo di persistenza corrente viene mantenuto e applicato alla fine del flusso OAuth all'utente che ha appena eseguito l'accesso, anche se la persistenza era none. Se la persistenza è specificata esplicitamente in quella pagina, sostituirà la persistenza dello stato di autenticazione mantenuto dalla pagina precedente che ha avviato il flusso di reindirizzamento.

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

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

Comportamento previsto tra le schede del browser

Quando vengono usati tipi di persistenza diversi, si applica il seguente comportamento previsto utilizzate in diverse schede. Il requisito è che in nessun momento non devono essere presenti contemporaneamente più tipi di stati salvati (ad es. stato di autenticazione salvato nei tipi di archiviazione session e local):

  • Gli utenti possono accedere utilizzando la persistenza session o none con utenti diversi su più schede. Ogni scheda non può vedere lo stato dell'altra.
  • Qualsiasi tentativo di accedere utilizzando la persistenza local verrà rilevato e sincronizzato su tutte le schede. Se l'utente aveva effettuato l'accesso in precedenza su una usando la persistenza session o none, lo stato verrà cancellato.
  • Se l'utente ha eseguito l'accesso in precedenza utilizzando la persistenza local con più schede aperte e poi passa alla persistenza none o session in una scheda, lo stato di quella scheda verrà modificato session o none e in tutte le altre schede, l'utente verrà disconnesso.