Sự kiên trì của 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 SDK JS của Firebase. Điều này bao gồm khả năng chỉ định liệu người dùng đã đăng nhập có nên được duy trì vô thời hạn cho đến khi đăng xuất rõ ràng hay không, bị xóa khi cửa sổ đóng hoặc bị xóa khi tải lại trang.

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

Tuy nhiên, có những trường hợp 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 xóa trạng thái khi đóng cửa sổ hoặc tab. Đ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 sử dụng trên một thiết bị được nhiều người dùng chia sẻ. Một ví dụ phổ biến ở đây là một ứng dụng chạy trên máy tính của thư viện.
  • Một ứng dụng trên một 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 ứng dụng đó được truy cập như thế nào và có thể muốn cung cấp cho người dùng khả năng chọn có tiếp tục phiên của họ hay không. Điều này có thể được thực hiện bằng cách thêm tùy chọn "Ghi nhớ 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 duy trì 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 (liên kết, mật khẩu, số điện thoại, v.v.).
  • Nhà phát triển có thể muốn cho phép những người dùng khác nhau đăng nhập vào ứng dụng trên các tab khác nhau. Hành vi mặc định là duy trì trạng thái trên các tab có cùng nguồn gốc.

Như đã nêu ở trên, có nhiều tình huống trong đó tính bền vững vĩnh viễn mặc định có thể cần được ghi đè.

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

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

liệt kê Giá trị Sự miêu tả
firebase.auth.Auth.Persistence.LOCAL 'địa phương' Cho biết trạng thái sẽ được duy trì ngay cả khi cửa sổ trình duyệt bị đóng hoặc hoạt động bị hủy trong React Native. Cần phải đăng xuất rõ ràng để xóa trạng thái đó. Lưu ý rằng phiên web Firebase Auth là nguồn gốc của một máy chủ duy nhất và sẽ chỉ được duy trì cho một tên miền duy nhất.
firebase.auth.Auth.Persistence.SESSION 'phiên họp' Cho biết trạng thái sẽ chỉ tồn tại trong phiên hoặc tab hiện tại và sẽ bị xóa khi tab hoặc cửa sổ mà người dùng xác thực bị đóng. Chỉ áp dụng cho các ứng dụng web.
firebase.auth.Auth.Persistence.NONE 'không có' Cho biết trạng thái sẽ chỉ được lưu trữ trong bộ nhớ và sẽ bị xóa khi cửa sổ hoặc hoạt động được làm mới.

Sửa đổi tính bền vững của trạng thái xác thực

Bạn có thể chỉ định hoặc sửa đổi kiểu lưu giữ hiện có bằng cách gọi phương thức firebase.auth().setPersistence :

Web modular API

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 namespaced API

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

Điều này sẽ thay đổi kiểu lưu giữ trên phiên bản Auth được chỉ định cho phiên Auth hiện đã lưu và áp dụng kiểu lưu giữ này cho các 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. Điều này sẽ trả về một lời hứa sẽ được giải quyết sau khi trạng thái hoàn tất việc sao chép từ loại lưu trữ này sang loại lưu trữ khác. Việc gọi phương thức đăng nhập sau khi thay đổi tính kiên trì sẽ đợi thay đổi liên tục đó hoàn tất trước khi áp dụng nó trên trạng thái Auth mới.

Mặc định cho trình duyệt web và ứng dụng React Native là local (miễ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ứ 3 được bật) trong khi đó none có cài đặt nào cho các ứng dụng phụ trợ Node.js.

Tổng quan về hành vi kiên trì

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

  • Ban đầu, SDK sẽ kiểm tra xem người dùng được xác thực có tồn tại hay không. Trừ khi setPersistence được gọi, loại lưu giữ hiện tại của người dùng đó sẽ đượ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 duy trì session trên trang web trước đó và một trang mới được truy cập, việc đăng nhập lại bằng một 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 tính năng duy trì session .
  • Nếu không có người dùng nào đăng nhập và không chỉ định tính kiên trì, 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 giữ mới được đặt thì mọi nỗ lực đăng nhập trong tương lai sẽ sử dụng kiểu lưu giữ đó.
  • Nếu người dùng đã đăng nhập và loại kiên trì được sửa đổi, thì người dùng đã đăng nhập hiện tại đó sẽ thay đổi tính bền vững thành loại mới. Tất cả các lần đăng nhập trong tương lai sẽ sử dụng tính bền vững mới đó.
  • Khi signInWithRedirect được gọi, loại lưu giữ hiện tại được giữ lại và áp dụng ở cuối luồng OAuth cho người dùng mới đăng nhập, ngay cả khi none lưu giữ lâu dài. Nếu thời gian lưu giữ được chỉ định rõ ràng trên trang đó, nó sẽ ghi đè thời gian lưu giữ trạng thái xác thực được giữ lại từ trang trước đó đã bắt đầu luồng chuyển hướng.

    Web modular API

    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 namespaced API

    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 tab trình duyệt

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

  • Người dùng có thể đăng nhập bằng session hoặc none cần kiên trì với những người dùng khác trên nhiều tab. Mỗi tab không thể nhìn thấy trạng thái của tab khác.
  • Mọi nỗ lực đăng nhập bằng tính năng lưu trữ local sẽ được phát hiện và đồng bộ hóa trên tất cả các tab. Nếu trước đó người dùng đã đăng nhập vào một tab cụ thể bằng session hoặc none sử dụng tính năng này thì trạng thái đó sẽ bị xóa.
  • Nếu người dùng trước đây đã đăng nhập bằng cách sử dụng tính năng lưu trữ local bộ với nhiều tab được mở và sau đó chuyển sang none trữ hoặc duy trì session trong một tab thì trạng thái của tab đó sẽ được sửa đổi với việc người dùng vẫn duy trì trong session hoặc none và trên tất cả các tab khác, người dùng sẽ được đăng xuất.