Buka konsol

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 defaultnya adalah mempertahankan sesi pengguna bahkan setelah pengguna menutup browser. Cara ini lebih mudah karena pengguna tidak perlu terus-menerus login setiap kali mengunjungi halaman web dari perangkat yang sama. Ini bisa berupa mengharuskan pengguna untuk memasukkan sandinya kembali, mengirimkan verifikasi SMS, dan berbagai tindakan lain yang dapat menambahkan banyak penghambat bagi pengalaman pengguna.

Akan tetapi, ada beberapa kasus yang menunjukkan 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 umum 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 akan menawarkan opsi 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 itu diupgrade ke akun non-anonim (tergabung, 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 pengguna yang sama.

Seperti disebutkan di atas, terdapat beberapa situasi saat persistensi permanen default mungkin perlu diganti.

Jenis persistensi status Auth yang didukung

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

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 saja.
firebase.auth.Auth.Persistence.SESSION 'session' Menunjukkan bahwa status hanya akan tetap ada 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 setelah jendela atau aktivitas dimuat ulang.

Mengubah persistensi status Auth

Anda dapat menetapkan atau mengubah tipe persistensi yang sudah ada dengan memanggil metode firebase.auth().setPersistence:

firebase.auth().setPersistence(firebase.auth.Auth.Persistence.SESSION)
  .then(function() {
    // 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(function(error) {
    // Handle Errors here.
    var errorCode = error.code;
    var errorMessage = error.message;
  });

Ini akan mengubah tipe persistensi pada instance Auth yang ditetapkan untuk sesi Auth yang saat ini disimpan dan menerapkan tipe persistensi ini untuk permintaan login berikutnya, termasuk login dengan permintaan pengalihan. Ini akan mengembalikan janji yang akan dijalankan setelah status selesai disalin dari 1 tipe penyimpanan ke tipe 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 bersifat local (asalkan browser mendukung mekanisme penyimpanan ini, misalnya cookie/data pihak ketiga diaktifkan), sedangkan aplikasi backend Node.js bersifat none.

Ringkasan tentang 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 sedang 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 dipertahankan dan diterapkan pada akhir alur OAuth ke pengguna yang baru login, sekalipun persistensinya none. Jika persistensi ditetapkan secara eksplisit pada halaman tersebut, persistensi status autentikasi yang dipertahankan dari halaman sebelumnya yang memulai alur pengalihan akan diganti.

    firebase.auth().setPersistence(firebase.auth.Auth.Persistence.NONE)
    .then(function() {
      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(function(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 saat jenis persistensi berbeda digunakan di tab lain. Persyaratannya adalah kapan pun tidak boleh ada beberapa jenis status tersimpan pada waktu yang sama (contohnya status autentikasi disimpan di jenis penyimpanan session dan local):

  • Pengguna dapat login menggunakan persistensi session atau none, sementara pengguna berbeda login pada beberapa tab. 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, lalu ia 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, sedangkan pengguna di semua tab lain akan di-logout.