Sie können festlegen, wie der Authentifizierungsstatus bei Verwendung des Firebase JS SDK beibehalten wird. Sie können auch festlegen, ob die Anmeldedaten eines angemeldeten Nutzers unbegrenzt gespeichert bleiben sollen, bis er sich explizit abmeldet, gelöscht werden, wenn das Fenster geschlossen wird, oder gelöscht werden, wenn die Seite neu geladen wird.
Bei einer Webanwendung wird die Sitzung eines Nutzers standardmäßig beibehalten, auch wenn der Nutzer den Browser schließt. Das ist praktisch, da sich der Nutzer nicht jedes Mal anmelden muss, wenn er die Webseite auf demselben Gerät besucht. Das könnte dazu führen, dass der Nutzer sein Passwort noch einmal eingeben oder eine SMS-Bestätigung senden muss, was die Nutzerfreundlichkeit erheblich beeinträchtigen kann.
Es gibt jedoch Fälle, in denen dieses Verhalten nicht ideal ist:
- Bei Anwendungen mit sensiblen Daten sollte der Status gelöscht werden, wenn das Fenster oder der Tab geschlossen wird. Das ist wichtig, falls der Nutzer vergisst, sich abzumelden.
- Apps, die auf einem Gerät verwendet werden, das von mehreren Nutzern gemeinsam genutzt wird. Ein häufiges Beispiel hierfür ist eine App, die auf einem Computer in einer Bibliothek ausgeführt wird.
- Eine Anwendung auf einem gemeinsam genutzten Gerät, auf die mehrere Nutzer zugreifen können. Der Entwickler kann nicht feststellen, wie auf diese Anwendung zugegriffen wird, und möchte Nutzern möglicherweise die Möglichkeit geben, zu entscheiden, ob ihre Sitzung beibehalten werden soll oder nicht. Dazu kann bei der Anmeldung die Option „Angemeldet bleiben“ hinzugefügt werden.
- In einigen Fällen möchten Entwickler einen anonymen Nutzer erst dann speichern, wenn dieser Nutzer ein Upgrade auf ein nicht anonymes Konto (föderiertes Konto, Passwort, Smartphone usw.) durchgeführt hat.
- Ein Entwickler möchte möglicherweise zulassen, dass sich verschiedene Nutzer in einer Anwendung auf verschiedenen Tabs anmelden. Standardmäßig wird der Status für dieselbe Quelle auf allen Tabs beibehalten.
Wie bereits erwähnt, gibt es mehrere Situationen, in denen die standardmäßige dauerhafte Persistenz möglicherweise überschrieben werden muss.
Unterstützte Typen der Authentifizierungsstatus-Persistenz
Sie können für eine bestimmte Firebase Auth-Instanz einen der drei Typen der Authentifizierungsstatusspeicherung auswählen, je nach den Anforderungen Ihrer Anwendung oder Nutzer.
Enum | Wert | Beschreibung |
---|---|---|
firebase.auth.Auth.Persistence.LOCAL |
'local' | Gibt an, dass der Status auch bei geschlossenem Browserfenster oder bei Beendigung der Aktivität in React Native beibehalten wird. Eine explizite Abmeldung ist erforderlich, um diesen Status zu löschen. Firebase Auth-Websitzungen haben einen einzelnen Hostursprung und werden nur für eine einzelne Domain gespeichert. |
firebase.auth.Auth.Persistence.SESSION |
„session“ | Gibt an, dass der Status nur in der aktuellen Sitzung oder im aktuellen Tab beibehalten wird und gelöscht wird, wenn der Tab oder das Fenster, in dem sich der Nutzer authentifiziert hat, geschlossen wird. Gilt nur für Web-Apps. |
firebase.auth.Auth.Persistence.NONE |
'none' | Gibt an, dass der Status nur im Arbeitsspeicher gespeichert und gelöscht wird, wenn das Fenster oder die Aktivität aktualisiert wird. |
Auth-Statusspeicherung ändern
Sie können den vorhandenen Typ der Persistenz angeben oder ändern, indem Sie die Methode firebase.auth().setPersistence
aufrufen:
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; });
Dadurch wird die Art der Persistenz in der angegebenen Auth-Instanz für die aktuell gespeicherte Auth-Sitzung geändert und diese Art der Persistenz wird auf zukünftige Anmeldeanfragen angewendet, einschließlich Anmeldeanfragen mit Weiterleitung. Dies gibt ein Promise zurück, das aufgelöst wird, sobald der Status von einem Speichertyp in den anderen kopiert wurde. Wenn Sie eine Anmeldemethode aufrufen, nachdem Sie die Persistenz geändert haben, wird gewartet, bis die Persistenzänderung abgeschlossen ist, bevor sie auf den neuen Authentifizierungsstatus angewendet wird.
Der Standardwert für Webbrowser und React Native-Apps ist local
, sofern der Browser diesen Speichermechanismus unterstützt, z. B. Drittanbieter-Cookies/-Daten sind aktiviert), für Node.js-Backend-Apps ist es none
.
Übersicht über das Persistenzverhalten
Bei der Bestimmung des aktuellen Status der Persistenz werden die folgenden Kriterien angewendet.
- Zuerst prüft das SDK, ob ein authentifizierter Nutzer vorhanden ist. Sofern
setPersistence
nicht aufgerufen wird, wird der aktuelle Speichertyp dieses Nutzers für zukünftige Anmeldeversuche angewendet. Wenn dieser Nutzer also auf einer vorherigen Webseite insession
gespeichert wurde und eine neue Seite besucht wurde, wird der Status dieses Nutzers bei der erneuten Anmeldung mit einem anderen Nutzer ebenfalls mitsession
-Persistenz gespeichert. - Wenn kein Nutzer angemeldet ist und keine Persistenz angegeben ist, wird die Standardeinstellung angewendet (
local
in einer Browser-App). - Wenn kein Nutzer angemeldet ist und ein neuer Typ der Persistenz festgelegt wird, wird bei allen zukünftigen Anmeldeversuchen dieser Typ der Persistenz verwendet.
- Wenn der Nutzer angemeldet ist und der Typ der Datenspeicherung geändert wird, wird die Datenspeicherung für den angemeldeten Nutzer auf den neuen Typ umgestellt. Bei allen zukünftigen Anmeldeversuchen wird diese neue Persistenz verwendet.
Wenn „signInWithRedirect“ aufgerufen wird, wird der aktuelle Speichertyp beibehalten und am Ende des OAuth-Ablaufs auf den neu angemeldeten Nutzer angewendet, auch wenn die Persistenz
none
war. Wenn die Persistenz auf dieser Seite explizit angegeben ist, wird die Persistenz des gespeicherten Authentifizierungsstatus von der vorherigen Seite überschrieben, auf der der Weiterleitungsvorgang gestartet wurde.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; });
Erwartetes Verhalten auf Browser-Tabs
Das folgende Verhalten wird erwartet, wenn auf verschiedenen Tabs unterschiedliche Speichertypen verwendet werden. Es dürfen nie mehrere Arten von gespeicherten Status gleichzeitig vorhanden sein (z. B. Authentifizierungsstatus, der in session
- und local
-Speichertypen gespeichert ist):
- Nutzer können sich mithilfe von
session
- odernone
-Persistenz mit verschiedenen Nutzern auf mehreren Tabs anmelden. Auf jedem Tab ist der Status des anderen Tabs nicht sichtbar. - Alle Versuche, sich mithilfe der
local
-Persistenz anzumelden, werden erkannt und auf allen Tabs synchronisiert. Wenn der Nutzer zuvor mithilfe vonsession
odernone
auf einem bestimmten Tab angemeldet war, wird dieser Status gelöscht. - Wenn der Nutzer zuvor mit
local
-Persistenz bei mehreren geöffneten Tabs angemeldet war und dann auf einem Tab zunone
- odersession
-Persistenz wechselt, wird der Status dieses Tabs geändert. Der Nutzer wird insession
odernone
gespeichert und auf allen anderen Tabs abgemeldet.