Persistenz des Authentifizierungsstatus

Sie können angeben, wie der Authentifizierungsstatus beibehalten wird, wenn Sie das Firebase JS SDK verwenden. Dazu gehört die Möglichkeit anzugeben, ob ein angemeldeter Benutzer auf unbestimmte Zeit bis zur expliziten Abmeldung bestehen bleiben soll, ob er gelöscht werden soll, wenn das Fenster geschlossen wird, oder ob er beim erneuten Laden der Seite gelöscht werden soll.

Bei einer Webanwendung besteht das Standardverhalten darin, die Sitzung eines Benutzers auch dann beizubehalten, wenn der Benutzer den Browser schließt. Dies ist praktisch, da sich der Benutzer nicht jedes Mal anmelden muss, wenn er die Webseite auf demselben Gerät besucht. Dies könnte erfordern, dass der Benutzer sein Passwort erneut eingeben, eine SMS-Bestätigung senden usw. muss, was das Benutzererlebnis erheblich erschweren könnte.

Es gibt jedoch Fälle, in denen dieses Verhalten möglicherweise nicht ideal ist:

  • Anwendungen mit sensiblen Daten möchten möglicherweise den Status löschen, wenn das Fenster oder die Registerkarte geschlossen wird. Dies ist wichtig für den Fall, dass der Benutzer vergisst, sich abzumelden.
  • Anwendungen, die auf einem von mehreren Benutzern gemeinsam genutzten Gerät verwendet werden. Ein häufiges Beispiel hierfür ist eine App, die auf einem Bibliothekscomputer ausgeführt wird.
  • Eine Anwendung auf einem gemeinsam genutzten Gerät, auf die mehrere Benutzer zugreifen können. Der Entwickler kann nicht erkennen, wie auf die Anwendung zugegriffen wird, und möchte einem Benutzer möglicherweise die Möglichkeit geben, zu entscheiden, ob er seine Sitzung beibehalten möchte oder nicht. Dies könnte durch Hinzufügen der Option „Angemeldet bleiben“ bei der Anmeldung erfolgen.
  • In manchen Situationen möchte ein Entwickler möglicherweise einen anonymen Benutzer nicht beibehalten, bis dieser Benutzer auf ein nicht anonymes Konto (Verbund-, Passwort-, Telefonkonto usw.) aktualisiert wird.
  • Ein Entwickler möchte möglicherweise zulassen, dass sich verschiedene Benutzer auf unterschiedlichen Registerkarten bei einer Anwendung anmelden. Das Standardverhalten besteht darin, den Status über mehrere Registerkarten hinweg für denselben Ursprung beizubehalten.

Wie oben erwähnt, gibt es mehrere Situationen, in denen die standardmäßige permanente Persistenz möglicherweise überschrieben werden muss.

Unterstützte Arten der Authentifizierungsstatuspersistenz

Sie können basierend auf den Anforderungen Ihrer Anwendung oder des Benutzers eine von drei Arten der Authentifizierungsstatuspersistenz für eine bestimmte Firebase Auth-Instanz auswählen.

Aufzählung Wert Beschreibung
firebase.auth.Auth.Persistence.LOCAL 'lokal' Gibt an, dass der Status auch dann bestehen bleibt, wenn das Browserfenster geschlossen oder die Aktivität in React Native zerstört wird. Um diesen Status zu löschen, ist eine explizite Abmeldung erforderlich. Beachten Sie, dass Firebase Auth-Websitzungen einen einzelnen Host-Ursprung haben und nur für eine einzelne Domäne bestehen bleiben.
firebase.auth.Auth.Persistence.SESSION 'Sitzung' Gibt an, dass der Status nur in der aktuellen Sitzung oder Registerkarte bestehen bleibt und gelöscht wird, wenn die Registerkarte oder das Fenster, in dem sich der Benutzer authentifiziert hat, geschlossen wird. Gilt nur für Web-Apps.
firebase.auth.Auth.Persistence.NONE 'keiner' Gibt an, dass der Status nur im Speicher gespeichert und gelöscht wird, wenn das Fenster oder die Aktivität aktualisiert wird.

Ändern der Authentifizierungsstatus-Persistenz

Sie können den vorhandenen Persistenztyp angeben oder ändern, indem Sie die Methode firebase.auth().setPersistence aufrufen:

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

Dadurch wird der Typ der Persistenz auf der angegebenen Auth-Instanz für die aktuell gespeicherte Auth-Sitzung geändert und dieser Typ der Persistenz auf zukünftige Anmeldeanfragen angewendet, einschließlich der Anmeldung mit Umleitungsanfragen. Dadurch wird ein Versprechen zurückgegeben, das aufgelöst wird, sobald der Status das Kopieren von einem Speichertyp auf den anderen abgeschlossen hat. Beim Aufrufen einer Anmeldemethode nach dem Ändern der Persistenz wird darauf gewartet, dass diese Persistenzänderung abgeschlossen ist, bevor sie auf den neuen Authentifizierungsstatus angewendet wird.

Die Standardeinstellung für Webbrowser und React Native-Apps ist local (vorausgesetzt, der Browser unterstützt diesen Speichermechanismus, z. B. Cookies/Daten von Drittanbietern sind aktiviert), während dies für Node.js-Backend-Apps none ist.

Überblick über das Persistenzverhalten

Bei der Bestimmung des aktuellen Persistenzstatus werden die folgenden Kriterien angewendet.

  • Zunächst prüft das SDK, ob ein authentifizierter Benutzer vorhanden ist. Sofern setPersistence nicht aufgerufen wird, wird der aktuelle Persistenztyp dieses Benutzers für zukünftige Anmeldeversuche angewendet. Wenn dieser Benutzer also in einer session auf einer vorherigen Webseite gespeichert war und eine neue Seite besucht wurde, führt die erneute Anmeldung mit einem anderen Benutzer dazu, dass der Status dieses Benutzers auch mit session gespeichert wird.
  • Wenn kein Benutzer angemeldet ist und keine Persistenz angegeben ist, wird die Standardeinstellung angewendet ( local in einer Browser-App).
  • Wenn kein Benutzer angemeldet ist und ein neuer Persistenztyp festgelegt ist, wird bei allen zukünftigen Anmeldeversuchen dieser Persistenztyp verwendet.
  • Wenn der Benutzer angemeldet ist und der Persistenztyp geändert wird, ändert der vorhandene angemeldete Benutzer die Persistenz auf die neue. Alle zukünftigen Anmeldeversuche werden diese neue Persistenz verwenden.
  • Wenn signInWithRedirect aufgerufen wird, wird der aktuelle Persistenztyp beibehalten und am Ende des OAuth-Flusses auf den neu angemeldeten Benutzer angewendet, auch wenn die Persistenz none war. Wenn die Persistenz auf dieser Seite explizit angegeben wird, überschreibt sie die beibehaltene Authentifizierungsstatus-Persistenz von der vorherigen Seite, die den Umleitungsfluss gestartet hat.

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

Erwartetes Verhalten auf allen Browser-Registerkarten

Das folgende erwartete Verhalten gilt, wenn unterschiedliche Persistenztypen in verschiedenen Registerkarten verwendet werden. Die Anforderung besteht darin, dass zu keinem Zeitpunkt mehrere Arten von gespeicherten Zuständen gleichzeitig vorhanden sein dürfen (z. B. in session gespeicherter Authentifizierungsstatus und local Speichertypen):

  • Benutzer können sich per session oder none Persistenz mit verschiedenen Benutzern auf mehreren Registerkarten anmelden. Jede Registerkarte kann den Status der anderen Registerkarte nicht sehen.
  • Jeder Versuch, sich mit local Persistenz anzumelden, wird auf allen Registerkarten erkannt und synchronisiert. Wenn der Benutzer zuvor auf einer bestimmten Registerkarte mit session oder none Persistenz angemeldet war, wird dieser Status gelöscht.
  • Wenn der Benutzer zuvor mit local Persistenz bei mehreren geöffneten Registerkarten angemeldet war und dann auf einer Registerkarte zu none “ oder „ session “ wechselt, wird der Status dieser Registerkarte geändert, wobei der Benutzer in session “ oder none beibehalten wird und auf allen anderen Registerkarten der Benutzer wird abgemeldet.