Khả năng lưu trữ trạng thái xác thực

Bạn có thể chỉ định cách duy trì trạng thái Xác thực khi sử dụng Firebase SDK JS. Điều này bao gồm khả năng chỉ định xem người dùng đã đăng nhập có nên duy trì vô thời hạn cho đến khi đăng xuất rõ ràng, bị xoá khi cửa sổ đã đóng hoặc bị xoá khi tải lại trang.

Đối với một ứng dụng web, hành vi mặc định là duy trì phiên của người dùng ngay cả khi sau khi người dùng đóng trình duyệt. Điều này rất thuận tiện vì người dùng không yêu cầu người dùng phải đăng nhập liên tục mỗi khi người dùng truy cập trang web trên cùng một thiết bị. Khi đó, người dùng có thể phải nhập lại mật khẩu, gửi Xác minh qua SMS, v.v. có thể gây nhiều phiền hà cho trải nghiệm người dùng.

Tuy nhiên, có những trường hợp mà hành vi này có thể không lý tưởng:

  • Các ứng dụng có dữ liệu nhạy cảm có thể muốn xoá trạng thái khi cửa sổ hoặc thẻ đã đóng. Điều này rất quan trọng trong trường hợp người dùng quên đăng xuất.
  • Các ứng dụng được dùng trên một thiết bị được nhiều người dùng dùng chung. Điểm chung ví dụ ở đây là một ứng dụng chạy trong máy tính thư viện.
  • Một ứng dụng trên thiết bị dùng chung có thể được nhiều người dùng truy cập. Nhà phát triển không thể cho biết cách truy cập vào ứng dụng đó và có thể muốn để cho phép người dùng chọn có duy trì phiên của họ hay không hay không. Bạn có thể thực hiện việc này bằng cách thêm nút "Nhớ thông tin đăng nhập của tôi" trong khi đăng nhập.
  • Trong một số trường hợp, nhà phát triển có thể không muốn lưu giữ người dùng ẩn danh cho đến khi người dùng đó được nâng cấp lên tài khoản không ẩn danh (được liên kết, mật khẩu, điện thoại, v.v.).
  • Nhà phát triển nên cho phép nhiều người dùng đăng nhập vào một ứng dụng trên các thẻ khác nhau. Hành vi mặc định là duy trì trạng thái trên các thẻ cho cùng một nguồn gốc.

Như đã đề cập ở trên, có nhiều trường hợp khi phương thức cố định có thể cần được ghi đè.

Các loại cố định trạng thái xác thực được hỗ trợ

Bạn có thể chọn một trong ba loại cố định trạng thái xác thực trên một đối tượng Phiên bản xác thực Firebase dựa trên yêu cầu của người dùng hoặc ứng dụng của bạn.

Enum Giá trị Mô tả
firebase.auth.Auth.Persistence.LOCAL "local" Cho biết trạng thái sẽ được duy trì ngay cả khi cửa sổ trình duyệt đã đóng hoặc hoạt động bị huỷ bỏ trong React Native. Đăng xuất rõ ràng để xoá trạng thái đó. Xin lưu ý rằng các phiên web Xác thực Firebase nguồn gốc máy chủ lưu trữ duy nhất và sẽ chỉ được duy trì cho một miền.
firebase.auth.Auth.Persistence.SESSION "session" Cho biết rằng trạng thái sẽ chỉ tồn tại trong phiên hoặc thẻ hiện tại, và sẽ bị xoá khi thẻ hoặc cửa sổ mà người dùng xác thực đã đóng. Chỉ áp dụng cho ứng dụng web.
firebase.auth.Auth.Persistence.NONE "none" Cho biết trạng thái sẽ chỉ được lưu trữ trong bộ nhớ và sẽ bị xoá khi cửa sổ hoặc hoạt động được làm mới.

Sửa đổi tính năng lưu trữ trạng thái xác thực

Bạn có thể chỉ định hoặc sửa đổi kiểu cố định hiện tại bằng cách gọi phương thức Phương thức 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;
  });

Thao tác này sẽ thay đổi loại dữ liệu cố định trên phiên bản Xác thực được chỉ định cho phiên Xác thực hiện đã lưu và áp dụng loại cố định này cho yêu cầu đăng nhập trong tương lai, bao gồm cả đăng nhập bằng yêu cầu chuyển hướng. Thao tác này sẽ trả về lời hứa sẽ phân giải sau khi trạng thái hoàn tất việc sao chép từ một loại bộ nhớ khác nhau. Việc gọi một phương thức đăng nhập sau khi thay đổi dữ liệu cố định sẽ chờ điều đó thay đổi ổn định để hoàn tất trước khi áp dụng cho trạng thái Xác thực mới.

Giá trị mặc định cho trình duyệt web và ứng dụng React Native là local (với điều kiện là trình duyệt hỗ trợ cơ chế lưu trữ này, ví dụ: cookie/dữ liệu của bên thứ ba đã được bật) trong khi đó là none cho các ứng dụng phụ trợ Node.js.

Tổng quan về hành vi ổn định

Các tiêu chí sau đây sẽ được áp dụng khi xác định trạng thái hiện tại của bền vững.

  • Ban đầu, SDK sẽ kiểm tra xem có người dùng được xác thực hay không. Trừ phi setPersistence được gọi, kiểu cố định hiện tại của người dùng đó sẽ là được áp dụng cho các lần đăng nhập trong tương lai. Vì vậy, nếu người dùng đó vẫn còn trong session trên một trang web trước đó và một trang mới đã được truy cập, việc đăng nhập lại với người dùng khác sẽ dẫn đến trạng thái của người dùng đó cũng được lưu với dữ liệu cố định session.
  • Nếu không có người dùng nào đăng nhập và không có lưu trữ nào được chỉ định, thì chế độ cài đặt mặc định sẽ được áp dụng (local trong ứng dụng trình duyệt).
  • Nếu không có người dùng nào đăng nhập và một kiểu lưu trữ mới được thiết lập, thì bất kỳ lần đăng nhập sẽ sử dụng kiểu dữ liệu cố định đó.
  • Nếu người dùng đã đăng nhập và loại dữ liệu lưu trữ được sửa đổi, thì người dùng đã đăng nhập sẽ thay đổi lưu trữ cố định sang một tài khoản mới. Tất cả đăng nhập trong tương lai sẽ sử dụng dữ liệu cố định mới đó.
  • Khi gọi signInWith Redirect, loại cố định hiện tại sẽ được giữ lại và áp dụng ở cuối quy trình OAuth cho người dùng mới đăng nhập, ngay cả khi giá trị cố định là none. Nếu dữ liệu cố định được chỉ định rõ ràng trên trang đó, nó sẽ ghi đè trạng thái xác thực được giữ lại từ trang trước đã bắt đầu chuyển hướng.

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

Hành vi dự kiến trên các thẻ trình duyệt

Hành vi dự kiến sau đây sẽ áp dụng khi các loại dữ liệu cố định khác nhau được sử dụng trong các thẻ khác nhau. Yêu cầu đặt ra là tại bất kỳ thời điểm nào, không bao giờ có nhiều loại trạng thái đã lưu cùng một lúc (ví dụ: trạng thái xác thực được lưu trong sessionlocal loại bộ nhớ):

  • Người dùng có thể đăng nhập bằng cố định session hoặc none với người dùng khác nhau trên nhiều thẻ. Mỗi thẻ không thể xem trạng thái của thẻ khác.
  • Mọi hành vi đăng nhập bằng tài khoản cố định local sẽ được phát hiện và đã đồng bộ hoá trên tất cả các thẻ. Nếu trước đó người dùng đã đăng nhập trên một ứng dụng bằng cách sử dụng cố định session hoặc none, thì trạng thái đó sẽ bị xoá.
  • Nếu trước đó người dùng đã đăng nhập bằng local dữ liệu cố định với nhiều các thẻ đã mở rồi chuyển sang none hoặc session cố định trong một thẻ, trạng thái của thẻ đó sẽ được sửa đổi khi người dùng duy trì session hoặc none và trên tất cả các thẻ khác, người dùng sẽ bị đăng xuất.