Bạn có thể chỉ định cách duy trì trạng thái Xác thực khi sử dụng SDK JS Firebase. Điều này bao gồm khả năng chỉ định liệu người dùng đã đăng nhập có được duy trì vô thời hạn cho đến khi đăng xuất rõ ràng, bị xoá khi cửa sổ đóng hay bị xoá khi tải lại trang hay không.
Đố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 rất thuận tiện vì người dùng không bắt buộc phải liên tục đăng nhập mỗi khi truy cập vào 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 ra nhiều phiền toái cho trải nghiệm người dùng.
Tuy nhiên, có một số 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 xoá trạng thái khi cửa sổ hoặc thẻ bị đó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 sử dụng trên một thiết bị do nhiều người dùng chia sẻ. Một ví dụ phổ biến ở đây là ứ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 mà nhiều người dùng có thể truy cập. Nhà phát triển không thể 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 xem có duy trì phiên hay không. Bạn có thể thực hiện việc này bằng cách thêm tuỳ chọn "Ghi nhớ tôi" trong quá trình đă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 (liên kết, mật khẩu, điện thoại, v.v.).
- Nhà phát triển có thể muố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ư đã nêu ở trên, có nhiều trường hợp bạn có thể cần ghi đè trạng thái cố định vĩnh viễn mặc định.
Các loại trạng thái xác thực ổn định được hỗ trợ
Bạn có thể chọn một trong ba loại trạng thái xác thực ổn định trên một thực thể xác thực Firebase được chỉ định dựa trên yêu cầu của ứng dụng hoặc người dùng.
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 bị đóng hoặc hoạt động bị huỷ trong React Native. Bạn cần phải đăng xuất rõ ràng để xoá trạng thái đó. Xin lưu ý rằng các phiên web Firebase Auth là nguồn gốc máy chủ lưu trữ đơn và sẽ chỉ tồn tại cho một miền duy nhất. |
firebase.auth.Auth.Persistence.SESSION |
'session' | Cho biết 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 bị đó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 trạng thái Auth ổn định
Bạn có thể chỉ định hoặc sửa đổi loại dữ liệu cố định hiện có bằng cách gọi 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 thực thể Auth được chỉ định cho phiên Auth hiện đã lưu và áp dụng loại dữ liệu cố định này cho các yêu cầu đăng nhập trong tương lai, bao gồm cả yêu cầu đăng nhập bằng yêu cầu chuyển hướng. Thao tác 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ừ một loại bộ nhớ sang loại bộ nhớ khác. Việc gọi phương thức đăng nhập sau khi thay đổi trạng thái ổn định sẽ chờ thay đổi trạng thái ổn định đó hoàn tất trước khi áp dụng phương thức đó trên trạng thái Auth mới.
Giá trị 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ứ ba được bật)
trong khi đó là none
đối với các ứng dụng phụ trợ Node.js.
Tổng quan về hành vi ổn định
Các tiêu chí sau sẽ được áp dụng khi xác định trạng thái hiện tại của tính năng lưu trữ.
- Ban đầu, SDK sẽ kiểm tra xem có người dùng đã xác thực hay không. Trừ khi
setPersistence
được gọi, loại dữ liệu cố định 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 đó được lưu trữ trongsession
trên một trang web trước đó và một trang mới được truy cập, thì 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 trữ bằngsession
. - Nếu không có người dùng nào đăng nhập và không có chế độ liên tục 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à bạn đặt một loại trạng thái ổn định mới, thì mọi lần đăng nhập trong tương lai sẽ sử dụng loại trạng thái ổn định đó.
- Nếu người dùng đã đăng nhập và loại dữ liệu cố định được sửa đổi, thì người dùng đã đăng nhập hiện tại sẽ thay đổi dữ liệu cố định thành dữ liệu mới. Tất cả các lần đăng nhập trong tương lai sẽ sử dụng trạng thái ổn định mới đó.
Khi signInWithRedirect được gọi, loại dữ liệu cố định hiện tại sẽ được giữ lại và áp dụng vào cuối luồng OAuth cho người dùng mới đăng nhập, ngay cả khi dữ liệu cố định là
none
. Nếu trạng thái ổn định được chỉ định rõ ràng trên trang đó, thì trạng thái này sẽ ghi đè trạng thái xác thực ổn định được giữ lại từ trang trước đã bắt đầu quy trình 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 là tại bất kỳ thời điểm nào, không được 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 các loại bộ nhớ session
và local
):
- Người dùng có thể đăng nhập bằng cách sử dụng
session
hoặcnone
liên tục với nhiều người dùng trên nhiều thẻ. Mỗi thẻ không thể xem trạng thái của thẻ khác. - Mọi nỗ lực đăng nhập bằng trạng thái ổn đị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 vào một thẻ cụ thể bằng cách sử dụng trạng thái ổn địnhsession
hoặcnone
, thì trạng thái đó sẽ bị xoá. - Nếu trước đó người dùng đã đăng nhập bằng trạng thái ổn định
local
với nhiều thẻ đang mở, sau đó chuyển sang trạng thái ổn địnhnone
hoặcsession
trong một thẻ, thì trạng thái của thẻ đó sẽ được sửa đổi với người dùng được lưu giữ trongsession
hoặcnone
và trên tất cả các thẻ khác, người dùng sẽ bị đăng xuất.