您可以指定在使用 Firebase JS SDK 时身份验证状态如何保持。这包括指定是否应无限期保留已登录用户直到显式注销、在窗口关闭时清除或在页面重新加载时清除的能力。
对于 Web 应用程序,默认行为是即使在用户关闭浏览器后仍保留用户的会话。这很方便,因为用户不需要每次在同一设备上访问网页时都连续登录。这可能要求用户必须重新输入密码、发送短信验证等,这可能会给用户体验增加很多摩擦。
但是,在某些情况下,这种行为可能并不理想:
- 包含敏感数据的应用程序可能希望在窗口或选项卡关闭时清除状态。如果用户忘记退出,这一点很重要。
- 在多个用户共享的设备上使用的应用程序。这里的一个常见示例是在图书馆计算机中运行的应用程序。
- 共享设备上可能由多个用户访问的应用程序。开发人员无法判断该应用程序是如何被访问的,并且可能希望为用户提供选择是否保持其会话的能力。这可以通过在登录期间添加“记住我”选项来完成。
- 在某些情况下,开发人员可能不想保留匿名用户,直到该用户升级到非匿名帐户(联合、密码、电话等)。
- 开发人员可能希望允许不同的用户在不同的选项卡上登录应用程序。默认行为是跨相同来源的选项卡保持状态。
如上所述,有多种情况可能需要覆盖默认的永久持久性。
支持的身份验证状态持久性类型
您可以根据您的应用程序或用户的要求,在指定的 Firebase 身份验证实例上选择三种身份验证状态持久性类型之一。
枚举 | 价值 | 描述 |
---|---|---|
firebase.auth.Auth.Persistence.LOCAL | '当地的' | 表示即使在 React Native 中关闭浏览器窗口或销毁 Activity 时,状态也会保持不变。需要显式注销才能清除该状态。请注意,Firebase 身份验证 Web 会话是单一主机来源,并且仅针对单个域持续存在。 |
firebase.auth.Auth.Persistence.SESSION | '会议' | 表示状态只会在当前会话或标签页中持续存在,当用户认证的标签页或窗口关闭时会被清除。仅适用于 Web 应用程序。 |
firebase.auth.Auth.Persistence.NONE | '没有任何' | 表示状态只会存储在内存中,当窗口或活动刷新时会被清除。 |
修改 Auth 状态持久化
您可以通过调用firebase.auth().setPersistence
方法来指定或修改现有的持久性类型:
Web version 9
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 version 8
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; });
这将为当前保存的 Auth 会话更改指定 Auth 实例上的持久性类型,并将这种持久性类型应用于未来的登录请求,包括使用重定向请求登录。这将返回一个承诺,一旦状态完成从一种类型的存储复制到另一种类型的存储,该承诺就会解决。在更改持久性后调用登录方法将等待该持久性更改完成,然后再将其应用于新的身份验证状态。
Web 浏览器和 React Native 应用程序的默认设置是local
的(前提是浏览器支持这种存储机制,例如启用 3rd 方 cookie/数据),而 Node.js 后端应用程序则none
。
持久化行为概述
在确定持久性的当前状态时,将应用以下标准。
- 最初,SDK 将检查是否存在经过身份验证的用户。除非
setPersistence
,否则该用户的当前持久性类型将应用于未来的登录尝试。因此,如果该用户在前一个网页上的session
中持续存在并且访问了新页面,则使用其他用户再次登录将导致该用户的状态也与session
持续性一起保存。 - 如果没有用户登录并且没有指定持久性,则将应用默认设置(浏览器应用程序中的
local
)。 - 如果没有用户登录并且设置了新的持久性类型,则任何未来的登录尝试都将使用该类型的持久性。
- 如果用户已登录并修改了持久性类型,则现有登录用户会将持久性更改为新用户。所有未来的登录尝试都将使用新的持久性。
当 signInWithRedirect 被调用时,当前的持久性类型被保留并在 OAuth 流结束时应用到新登录的用户,即使持久性是
none
。如果在该页面上明确指定了持久性,它将覆盖启动重定向流的前一个页面中保留的身份验证状态持久性。Web version 9
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 version 8
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; });
跨浏览器选项卡的预期行为
当在不同的选项卡中使用不同的持久性类型时,将应用以下预期行为。要求是,在任何时候,都不应该同时存在多种类型的保存状态(例如,保存在session
中的身份验证状态和local
类型的存储):
- 用户可以在多个选项卡上使用不同用户的
session
none
持久性登录。每个选项卡都看不到另一个选项卡的状态。 - 任何使用
local
持久性登录的尝试都将被检测到并在所有选项卡上同步。如果用户之前使用session
或none
持久性在特定选项卡上登录,则该状态将被清除。 - 如果用户之前使用
local
持久性登录并打开了多个选项卡,然后在一个选项卡中切换到none
或session
持久性,则该选项卡的状态将被修改为用户在session
中保持或none
,而在所有其他选项卡上,用户将被注销。