使用 JavaScript 匿名进行 Firebase 身份验证

您可以用 Firebase 身份验证功能创建和使用临时匿名帐号来进行 Firebase 身份验证。借助临时匿名帐号,尚未注册应用的用户也可以使用受安全规则保护的数据。如果匿名用户决定注册您的应用,您可以将他们的登录凭据与匿名帐号关联,这样他们就可以在以后的会话中继续使用其受保护的数据。

准备工作

  1. 将 Firebase 添加到您的 JavaScript 项目
  2. 如果您尚未将您的应用与 Firebase 项目关联,请在 Firebase 控制台中进行关联。
  3. 启用匿名身份验证:
    1. Firebase 控制台中,打开 Auth 部分。
    2. Sign-in Methods(登录方法)页面中,启用匿名登录方法。
    3. 可选:如果您已将项目升级为采用 Firebase Authentication with Identity Platform,则可以启用自动清理。启用此设置后,系统会自动删除超过 30 天的匿名帐号。在启用了自动清理的项目中,匿名身份验证将不再计入用量限额或结算配额。请参阅自动清理

匿名进行 Firebase 身份验证

要使未登录的用户能够使用需要进行 Firebase 身份验证的应用功能,您可以通过以下步骤让用户匿名登录:

  1. 调用 signInAnonymously 方法:

    Web 模块化 API

    import { getAuth, signInAnonymously } from "firebase/auth";
    
    const auth = getAuth();
    signInAnonymously(auth)
      .then(() => {
        // Signed in..
      })
      .catch((error) => {
        const errorCode = error.code;
        const errorMessage = error.message;
        // ...
      });

    Web 命名空间型 API

    firebase.auth().signInAnonymously()
      .then(() => {
        // Signed in..
      })
      .catch((error) => {
        var errorCode = error.code;
        var errorMessage = error.message;
        // ...
      });
    您还可以在此处捕获并处理错误。如需获取错误代码列表,请参阅身份验证参考文档
  2. 如果 signInAnonymously 方法顺利完成,且未出现任何错误,那么 onAuthStateChanged 中注册的观测器 (observer) 就会被触发,并且您可以从 User 对象中获取匿名用户的帐号数据:

    Web 模块化 API

    import { getAuth, onAuthStateChanged } from "firebase/auth";
    
    const auth = getAuth();
    onAuthStateChanged(auth, (user) => {
      if (user) {
        // User is signed in, see docs for a list of available properties
        // https://firebase.google.com/docs/reference/js/auth.user
        const uid = user.uid;
        // ...
      } else {
        // User is signed out
        // ...
      }
    });

    Web 命名空间型 API

    firebase.auth().onAuthStateChanged((user) => {
      if (user) {
        // User is signed in, see docs for a list of available properties
        // https://firebase.google.com/docs/reference/js/v8/firebase.User
        var uid = user.uid;
        // ...
      } else {
        // User is signed out
        // ...
      }
    });

将匿名帐号转成永久帐号

当匿名用户注册您的应用时,您可能需要允许其使用新帐号继续之前的操作。例如,您可能需要将用户在注册之前添加到购物车中的商品移到其新帐号的购物车中。为此,请完成以下步骤:

  1. 当用户注册时,按照用户身份验证提供方的登录流程逐步进行,直到需要调用某一 Auth.signInWith 方法时停止。例如,获取用户的 Google ID 令牌、Facebook 访问令牌或电子邮件地址和密码。
  2. 为新的身份验证提供方获取 AuthCredential

    Google 登录

    Web 模块化 API

    import { GoogleAuthProvider } from "firebase/auth";
    
    const credential = GoogleAuthProvider.credential(
      googleUser.getAuthResponse().id_token);

    Web 命名空间型 API

    var credential = firebase.auth.GoogleAuthProvider.credential(
      googleUser.getAuthResponse().id_token);
    Facebook 登录

    Web 模块化 API

    import { FacebookAuthProvider } from "firebase/auth";
    
    const credential = FacebookAuthProvider.credential(
      response.authResponse.accessToken);

    Web 命名空间型 API

    var credential = firebase.auth.FacebookAuthProvider.credential(
      response.authResponse.accessToken);
    电子邮件地址与密码登录

    Web 模块化 API

    import { EmailAuthProvider } from "firebase/auth";
    
    const credential = EmailAuthProvider.credential(email, password);

    Web 命名空间型 API

    var credential = firebase.auth.EmailAuthProvider.credential(email, password);
  3. AuthCredential 对象传递给登录用户的 link 方法:

    Web 模块化 API

    import { getAuth, linkWithCredential } from "firebase/auth";
    
    const auth = getAuth();
    linkWithCredential(auth.currentUser, credential)
      .then((usercred) => {
        const user = usercred.user;
        console.log("Anonymous account successfully upgraded", user);
      }).catch((error) => {
        console.log("Error upgrading anonymous account", error);
      });

    Web 命名空间型 API

    auth.currentUser.linkWithCredential(credential)
      .then((usercred) => {
        var user = usercred.user;
        console.log("Anonymous account successfully upgraded", user);
      }).catch((error) => {
        console.log("Error upgrading anonymous account", error);
      });

如果对 link 的调用成功完成,用户的新帐号便可以访问匿名帐号的 Firebase 数据。

自动清理

如果您已将项目升级为采用 Firebase Authentication with Identity Platform,则可以在 Firebase 控制台中启用自动清理。启用此功能即表示您允许 Firebase 自动删除超过 30 天的匿名帐号。在启用了自动清理的项目中,匿名身份验证不会计入用量限额或结算配额。

  • 启用自动清理后创建的任何匿名帐号都可能会在创建 30 天后随时自动删除。
  • 在启用自动清理前创建的匿名帐号将在启用自动清理 30 天后开始自动删除。
  • 如果您关闭了自动清理,计划删除的匿名帐号仍将按照计划删除。这些帐号不会计入用量限额或结算配额。
  • 如果您通过将匿名帐号与任何登录方法相关联来“升级”该帐号,则系统不会自动删除该帐号。

如果您想在启用此功能前了解多少用户会受到影响,并且您已将项目升级为采用 Firebase Authentication with Identity Platform,则可以在 Cloud Logging 中按 is_anon 进行过滤。

后续步骤

在用户可以进行 Firebase 身份验证后,您可以使用 Firebase 规则控制用户对您 Firebase 数据库中的数据的访问权限。