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 bestehen bleiben soll, bis er sich ausdrücklich abmeldet, gelöscht wird, wenn das Fenster geschlossen wird, oder gelöscht wird, wenn die Seite neu geladen wird.

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

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

  • Anwendungen mit vertraulichen Daten möchten möglicherweise den Status löschen, wenn das Fenster oder die Registerkarte geschlossen wird. Dies ist wichtig, falls der Benutzer vergisst, sich abzumelden.
  • Anwendungen, die auf einem von mehreren Benutzern gemeinsam genutzten Gerät verwendet werden. Ein gängiges Beispiel hierfür ist eine App, die auf einem Bibliothekscomputer ausgeführt wird.
  • Eine Anwendung auf einem gemeinsam genutzten Gerät, auf die möglicherweise mehrere Benutzer zugreifen. Der Entwickler kann nicht sagen, wie auf diese Anwendung zugegriffen wird, und möchte einem Benutzer möglicherweise die Möglichkeit geben, zu wählen, ob er seine Sitzung beibehalten möchte oder nicht. Dies kann durch Hinzufügen einer Option „Anmelden speichern“ während der Anmeldung erfolgen.
  • In einigen Situationen möchte ein Entwickler einen anonymen Benutzer möglicherweise nicht beibehalten, bis dieser Benutzer auf ein nicht anonymes Konto aktualisiert wird (verbunden, Kennwort, Telefon usw.).
  • Ein Entwickler möchte möglicherweise zulassen, dass sich verschiedene Benutzer auf verschiedenen Registerkarten bei einer Anwendung anmelden. Das Standardverhalten besteht darin, den Zustand über 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 Auth-Zustandspersistenz

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

Aufzählung Wert Beschreibung
firebase.auth.Auth.Persistence.LOCAL 'lokal' Gibt an, dass der Zustand beibehalten wird, auch wenn das Browserfenster geschlossen wird 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 von einem einzelnen Host stammen und nur für eine einzelne Domäne beibehalten werden.
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 Persistenz des Auth-Status

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

Web version 9

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 version 8

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 Persistenztyp für die angegebene Authentifizierungsinstanz für die aktuell gespeicherte Authentifizierungssitzung geändert und dieser Persistenztyp für zukünftige Anmeldeanforderungen angewendet, einschließlich Anmeldungen mit Umleitungsanforderungen. Dadurch wird ein Versprechen zurückgegeben, das aufgelöst wird, sobald der Zustand das Kopieren von einem Speichertyp zum anderen abgeschlossen hat. Beim Aufrufen einer Anmeldemethode nach dem Ändern der Persistenz wird auf den Abschluss dieser Persistenzänderung gewartet, 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 none -Backend-Apps nicht der Fall ist.

Überblick über das Persistenzverhalten

Die folgenden Kriterien werden angewendet, wenn der aktuelle Zustand der Persistenz bestimmt wird.

  • 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 auf einer vorherigen Webseite in der session verblieben ist und eine neue Seite besucht wurde, führt die erneute Anmeldung mit einem anderen Benutzer dazu, dass der Status dieses Benutzers ebenfalls mit der session gespeichert wird.
  • Wenn kein Benutzer angemeldet 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 dieser vorhandene angemeldete Benutzer die Persistenz auf den neuen. Alle zukünftigen Anmeldeversuche verwenden diese neue Persistenz.
  • Wenn signInWithRedirect aufgerufen wird, wird der aktuelle Persistenztyp beibehalten und am Ende des OAuth-Flusses auf den neu angemeldeten Benutzer angewendet, selbst wenn die Persistenz none war. Wenn die Persistenz explizit auf dieser Seite angegeben ist, wird die Persistenz des beibehaltenen Authentifizierungsstatus von der vorherigen Seite, die den Umleitungsfluss gestartet hat, überschrieben.

    Web version 9

    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 version 8

    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 über Browser-Tabs hinweg

Das folgende erwartete Verhalten gilt, wenn verschiedene Persistenztypen auf verschiedenen Registerkarten verwendet werden. Die Anforderung ist, dass zu keinem Zeitpunkt mehrere Arten von gespeicherten Zuständen gleichzeitig vorhanden sein sollten (z. B. in session gespeicherter Authentifizierungsstatus und local Speicherarten):

  • Benutzer können sich mit 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 erkannt und auf allen Registerkarten 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 mit 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 und auf allen anderen Registerkarten der Benutzer beibehalten wird wird abgemeldet.