Persistensi Status Authentication

Anda dapat menentukan bagaimana persistensi status Authentication saat menggunakan Firebase JS SDK. Ini mencakup kemampuan untuk menentukan apakah pengguna yang sudah login akan tetap login tanpa batas waktu hingga secara eksplisit melakukan logout, hingga saat jendela ditutup, atau hingga saat halaman dimuat ulang.

Untuk aplikasi web, perilaku default-nya adalah mempertahankan sesi pengguna bahkan setelah pengguna menutup browser. Ini adalah cara yang praktis karena pengguna tidak perlu terus-menerus login setiap kali mengunjungi halaman web dari perangkat yang sama. Bila harus selalu login, pengguna akan diharuskan memasukkan sandinya lagi, menunggu verifikasi SMS, dan berbagai tindakan lain yang dapat cukup mengganggu pengalaman pengguna.

Namun dalam beberapa kasus, perilaku ini mungkin tidak ideal:

  • Untuk aplikasi yang berisi data sensitif, status sebaiknya dibersihkan saat jendela atau tab ditutup. Hal ini penting dilakukan seandainya pengguna lupa logout.
  • Aplikasi yang digunakan di perangkat yang dipakai bersama oleh beberapa pengguna. Contoh umumnya adalah aplikasi yang dijalankan di komputer perpustakaan.
  • Aplikasi di perangkat bersama yang dapat diakses oleh beberapa pengguna. Developer tidak dapat mengetahui bagaimana aplikasi itu diakses dan sebaiknya menawarkan opsi kepada pengguna apakah sesi perlu dipertahankan atau tidak. Ini dapat dilakukan dengan menambahkan opsi "Ingat saya" saat login.
  • Dalam situasi tertentu, developer mungkin tidak ingin mempertahankan pengguna anonim hingga pengguna tersebut diupgrade ke akun non-anonim (penyedia gabungan, sandi, ponsel, dsb.).
  • Developer mungkin ingin mengizinkan pengguna lain login ke aplikasi dari tab berbeda. Perilaku default-nya adalah mempertahankan status di seluruh tab untuk asal yang sama.

Seperti disebutkan di atas, dalam beberapa situasi, persistensi permanen yang bersifat default mungkin perlu diabaikan.

Jenis persistensi status Auth yang didukung

Anda dapat memilih salah satu dari tiga jenis persistensi status Auth di instance Firebase Auth yang ditetapkan berdasarkan aplikasi Anda atau persyaratan pengguna.

Enum Nilai Deskripsi
firebase.auth.Auth.Persistence.LOCAL 'local' Menunjukkan bahwa status akan dipertahankan bahkan saat jendela browser ditutup atau aktivitasnya dihancurkan di React Native. Logout eksplisit diperlukan untuk membersihkan status tersebut. Perhatikan bahwa sesi web Firebase Auth adalah asal host tunggal dan hanya akan dipertahankan untuk domain tunggal.
firebase.auth.Auth.Persistence.SESSION 'session' Menunjukkan bahwa status hanya akan dipertahankan di sesi atau tab saat ini, dan akan dibersihkan pada saat tab atau jendela tempat pengguna diautentikasi ditutup. Hanya berlaku untuk aplikasi web.
firebase.auth.Auth.Persistence.NONE 'none' Menunjukkan bahwa status hanya akan disimpan di memori dan akan dibersihkan ketika jendela atau aktivitas dimuat ulang.

Mengubah persistensi status Auth

Anda dapat menentukan atau mengubah jenis persistensi yang ada dengan memanggil metode firebase.auth().setPersistence:

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

API dengan namespace 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;
  });

Ini akan mengubah jenis persistensi pada instance Auth yang ditetapkan untuk sesi Auth yang saat ini disimpan dan menerapkan jenis persistensi ini untuk permintaan login berikutnya, termasuk login dengan permintaan pengalihan. Ini akan menampilkan promise yang akan diselesaikan setelah statusnya disalin dari satu jenis penyimpanan ke jenis lainnya. Pemanggilan metode login setelah persistensi diganti akan menunggu hingga perubahan persistensi tersebut selesai sebelum menerapkannya di status Auth baru.

Default untuk browser web dan aplikasi React Native adalah local (asalkan browser mendukung mekanisme penyimpanan ini, misalnya cookie/data pihak ketiga diaktifkan), sedangkan default untuk aplikasi backend Node.js adalah none.

Ringkasan perilaku persistensi

Kriteria berikut akan diterapkan saat menentukan status persistensi saat ini.

  • Pertama-tama, SDK akan memeriksa apakah pengguna terautentikasi sudah ada. Kecuali jika setPersistence dipanggil, jenis persistensi pengguna saat ini akan diterapkan untuk upaya login berikutnya. Jadi, jika pengguna dipertahankan di session pada halaman sebelumnya dan halaman baru dikunjungi, login kembali dengan pengguna yang berbeda akan menyebabkan status pengguna tersebut juga disimpan dengan persistensi session.
  • Jika tidak ada pengguna yang login dan tidak ada persistensi yang ditetapkan, setelan default akan diterapkan (local di aplikasi browser).
  • Jika tidak ada pengguna yang login dan jenis persistensi baru ditetapkan, semua upaya login berikutnya akan menggunakan jenis persistensi tersebut.
  • Jika pengguna login dan jenis persistensi diubah, pengguna yang sudah login tersebut akan mengganti persistensi ke jenis yang baru. Semua upaya login berikutnya akan menggunakan persistensi baru tersebut.
  • Jika signInWithRedirect dipanggil, jenis persistensi saat ini akan dipertahankan dan diterapkan pada akhir alur OAuth ke pengguna yang baru login, meskipun persistensinya none. Jika persistensi ditetapkan secara eksplisit pada halaman tersebut, persistensi status autentikasi yang dipertahankan dari halaman sebelumnya yang memulai alur pengalihan akan diganti.

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

    API dengan namespace 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;
      });

Perilaku yang diharapkan di seluruh tab browser

Perilaku yang diharapkan berikut akan berlaku jika jenis persistensi berbeda digunakan di beberapa tab. Persyaratannya adalah tidak boleh ada beberapa jenis status tersimpan pada saat yang sama (contohnya, status autentikasi disimpan di jenis penyimpanan session dan local):

  • Pengguna yang berbeda pada setiap tab dapat login menggunakan persistensi session atau none. Setiap tab tidak dapat melihat status tab lain.
  • Setiap upaya login menggunakan persistensi local akan dideteksi dan disinkronkan di semua tab. Jika sebelumnya pengguna login di tab tertentu menggunakan persistensi session atau none, status tersebut akan dihapus.
  • Jika sebelumnya pengguna login menggunakan persistensi local sementara beberapa tab terbuka, kemudian beralih ke persistensi none atau session di salah satu tab, maka status tab tersebut akan diubah dan pengguna akan dipertahankan dalam persistensi session atau none, dan pengguna akan diproses agar logout di semua tab lainnya.