匿名进行 Firebase 身份验证

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

准备工作

  1. 按照使用入门指南中的步骤操作(如果您尚未这样做)。

  2. 启用匿名登录:

    • 在 Firebase 控制台的 Authentication 部分中,打开登录方法页面。
    • 登录方法页面中,启用 Anonymous sign-in(匿名登录)方法,然后点击保存

匿名进行 Firebase 身份验证

当某个未登录的用户使用需要进行 Firebase 身份验证的应用功能时,可通过调用 signInAnonymously() 让用户匿名登录:

try {
  final userCredential =
      await FirebaseAuth.instance.signInAnonymously();
  print("Signed in with temporary account.");
} on FirebaseAuthException catch (e) {
  switch (e.code) {
    case "operation-not-allowed":
      print("Anonymous auth hasn't been enabled for this project.");
      break;
    default:
      print("Unknown error.");
  }
}

将匿名帐号转成永久帐号

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

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

  2. 为新的身份验证提供方获取 Credential 对象:

    // Google Sign-in
    final credential = GoogleAuthProvider.credential(idToken: idToken);
    
    // Email and password sign-in
    final credential =
        EmailAuthProvider.credential(email: emailAddress, password: password);
    
    // Etc.
    
  3. Credential 对象传递给登录用户的 linkWithCredential() 方法:

    try {
      final userCredential = await FirebaseAuth.instance.currentUser
          ?.linkWithCredential(credential);
    } on FirebaseAuthException catch (e) {
      switch (e.code) {
        case "provider-already-linked":
          print("The provider has already been linked to the user.");
          break;
        case "invalid-credential":
          print("The provider's credential is not valid.");
          break;
        case "credential-already-in-use":
          print("The account corresponding to the credential already exists, "
              "or is already linked to a Firebase User.");
          break;
        // See the API reference for the full list of error codes.
        default:
          print("Unknown error.");
      }
      ```
    

如果对 linkWithCredential() 的调用成功,用户的新帐号就可以访问匿名帐号的 Firebase 数据了。

后续步骤

用户创建新帐号后,此帐号会存储为您的 Firebase 项目的一部分,无论用户使用哪种登录方法,您都可以使用此帐号在您项目中的每个应用中识别该用户。

在您的应用中,您可以从 User 对象获取用户的基本个人资料信息。请参阅管理用户

在您的 Firebase Realtime Database 和 Cloud Storage 安全规则中,您可以从 auth 变量获取已登录用户的唯一用户 ID,然后用其控制用户可以访问哪些数据。

您可以将身份验证服务提供方凭据关联至现有用户帐号,让用户可以使用多个身份验证服务提供方登录您的应用。

如需让用户退出登录,请调用 signOut()

await FirebaseAuth.instance.signOut();