Trwałość stanu uwierzytelniania

Możesz określić, jak ma być utrzymywany stan uwierzytelniania podczas korzystania z Firebase SDK JS. Obejmuje to możliwość określenia, czy zalogowany użytkownik powinien jest bezterminowo zachowywany, dopóki nie nastąpi bezpośrednie wylogowanie, a gdy okno zostanie usunięte, zamknięte lub usunięte przy ponownym załadowaniu strony.

W przypadku aplikacji internetowych domyślnym działaniem jest utrwalanie sesji użytkownika nawet po zamknięciu przeglądarki przez użytkownika. To wygodne, ponieważ użytkownik nie wymaga ciągłego logowania się przy każdym odwiedzeniu strony urządzenia. Może to wymagać od użytkownika ponownego wprowadzenia hasła, wysłania weryfikacja przez SMS itp., która może utrudniać korzystanie z internetu.

W niektórych przypadkach takie zachowanie może jednak nie być idealne:

  • Aplikacje z danymi wrażliwymi mogą chcieć wyczyścić stan, gdy okno jest zamknięta. Jest to ważne, jeśli użytkownik zapomni się wylogować.
  • Aplikacje używane na urządzeniu współużytkowanym przez wielu użytkowników. Częstym Oto przykład aplikacji uruchomionej na komputerze w bibliotece.
  • Aplikacja na współdzielonym urządzeniu, z którego może korzystać wielu użytkowników. Deweloper nie jest w stanie określić, w jaki sposób uzyskuje się dostęp do aplikacji, i może chcieć aby użytkownik mógł zdecydować, czy kontynuować sesję lub nie. Można to zrobić, dodając opcję „Zapamiętaj mnie”. podczas logowania.
  • Czasami deweloper może nie chcieć, aby anonimowy użytkownik był zachowywany. dopóki użytkownik nie przejdzie na nieanonimowe konto (sfederowane, telefon itp.).
  • Programista może zezwalać na logowanie się do aplikacji różnym użytkownikom. na różnych kartach. Domyślnym działaniem jest zachowywanie stanu na różnych kartach dla tego samego punktu początkowego.

Jak wspomniano powyżej, istnieje wiele sytuacji, w których domyślna wartość stała trwałość może zostać zastąpiona.

Obsługiwane typy trwałości stanu uwierzytelniania

Możesz wybrać jeden z 3 typów trwałości stanu uwierzytelniania na określonym wystąpienia uwierzytelniania Firebase na podstawie wymagań aplikacji lub użytkownika.

Typ wyliczeniowy Wartość Opis
firebase.auth.Auth.Persistence.LOCAL „lokalny” Wskazuje, że stan zostanie zachowany nawet wtedy, gdy okno przeglądarki będzie jest zamknięta lub aktywność została zniszczona w React Native. Wyraźne wylogowanie jest potrzebna do usunięcia tego stanu. Pamiętaj, że sesje internetowe uwierzytelniania Firebase pojedyncze źródło hosta i będzie zachowywane tylko dla jednej domeny.
firebase.auth.Auth.Persistence.SESSION „session” Wskazuje, że stan zostanie zachowany tylko w bieżącej sesji lub na bieżącej karcie, i zostanie wyczyszczone, gdy karta lub okno, w którym użytkownik się uwierzytelnił jest zamknięte. Dotyczy tylko aplikacji internetowych.
firebase.auth.Auth.Persistence.NONE „none” (brak) Wskazuje, że stan zostanie zapisany tylko w pamięci i zostanie wyczyszczony po odświeżeniu okna lub aktywności.

Modyfikowanie trwałości stanu uwierzytelniania

Możesz określić lub zmienić istniejący typ trwałości, wywołując metodę Metoda 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;
  });

Spowoduje to zmianę typu trwałości w określonej instancji uwierzytelniania dla aktualnie zapisanej sesji uwierzytelniania i zastosuj ten typ trwałości dla żądań logowania, w tym logowania z żądaniami przekierowania. Dzięki temu zwraca obietnicę, która zostanie zakończona, gdy stan zakończy kopiowanie z jednego z nich lub rodzaj pamięci masowej. Wywołanie metody logowania po zmianie trwałości spowoduje poczekanie na tę zmianę trwałość, aby zakończyć przed zastosowaniem w nowym stanie uwierzytelniania.

Ustawienie domyślne w przypadku przeglądarki i aplikacji natywnych React to local (pod warunkiem, że przeglądarka obsługuje ten mechanizm przechowywania, np. pliki cookie/dane innych firm są włączone). a none w przypadku aplikacji backendu Node.js.

Omówienie zachowania trwałości

Podczas określania bieżącego stanu zostaną zastosowane następujące kryteria wytrwałość.

  • Na początek pakiet SDK sprawdzi, czy istnieje uwierzytelniony użytkownik. O ile Funkcja setPersistence zostanie wywołana, a bieżący typ trwałości użytkownika będzie miał wartość stosowane w przypadku kolejnych prób logowania. Jeśli więc użytkownik był utrwalony session na poprzedniej stronie internetowej i odwiedzono nową stronę, zalogowanie się przez innego użytkownika spowoduje, że stan tego użytkownika również zapisane z trwałością session.
  • Jeśli nie jest zalogowany żaden użytkownik i nie określono trwałości, ustawienie domyślne zostanie zastosowany (local w przeglądarce).
  • Jeśli żaden użytkownik nie jest zalogowany i ustawiono nowy typ trwałości, wszelka przyszła dla próby zalogowania się będzie stosowany ten typ trwałości.
  • Jeśli użytkownik jest zalogowany, a typ trwałości został zmieniony, istniejący zalogowany użytkownik zmieni trwałość na nowego. Wszystkie przyszłe logowania będzie używać tej nowej trwałości.
  • Po wywołaniu signInWithRedirect jest zachowywany bieżący typ trwałości. i są stosowane na końcu procesu OAuth do nowo zalogowanego użytkownika, nawet jeśli trwałość wyniosła none. Jeśli trwałość jest jednoznacznie określona na tej stronie, zastąpi ona zachowano stan uwierzytelniania z poprzedniej strony, która rozpoczęła .

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

Oczekiwane działanie na różnych kartach przeglądarki

Poniższe oczekiwane działanie będzie stosowane, gdy różne typy trwałości na różnych kartach. Wymagamy, aby na żadnym etapie mogą mieć jednocześnie wiele typów zapisanych stanów (np. stan uwierzytelniania zapisany w session i local typ pamięci masowej):

  • Użytkownicy mogą logować się z różnymi użytkownikami przy użyciu zasady session lub none na wielu kartach. Żadna z kart nie widzi stanu drugiej.
  • Każda próba zalogowania się z wykorzystaniem trwałości funkcji local zostanie wykryta i synchronizowany na wszystkich kartach. Jeśli użytkownik był wcześniej zalogowany na określonym za pomocą trwałości session lub none, stan zostanie wyczyszczony.
  • Jeśli użytkownik był wcześniej zalogowany za pomocą trwałości funkcji local z wieloma karty zostały otwarte, a następnie przełączają się na trwałość none lub session w jednej karcie, stan tej karty zostanie zmieniony i użytkownik będzie nadal mieć dostęp do session lub none oraz na wszystkich pozostałych kartach zostaną wylogowane.