Google 致力于为黑人社区推动种族平等。查看具体举措

身份验证状态持久性

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

您可以指定在使用 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持久性登录的尝试都将被检测到并在所有选项卡上同步。如果用户之前使用sessionnone持久性在特定选项卡上登录,则该状态将被清除。
  • 如果用户之前使用local持久性登录并打开了多个选项卡,然后在一个选项卡中切换到nonesession持久性,则该选项卡的状态将被修改为用户在session中保持或none ,而在所有其他选项卡上,用户将被注销。