匿名进行 Firebase 身份验证 (C++)

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

准备工作

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

匿名进行 Firebase 身份验证

当某个未登录的用户使用需要进行 Firebase 身份验证的应用功能时,您可以按以下步骤操作,让用户匿名登录:

Auth 类是所有 API 调用都需要通过的门户,
  1. 添加 Auth 和 App 头文件:
    #include "firebase/app.h"
    #include "firebase/auth.h"
    
  2. 在您的初始化代码中,创建一个 firebase::App 类。
    #if defined(__ANDROID__)
      firebase::App* app =
          firebase::App::Create(firebase::AppOptions(), my_jni_env, my_activity);
    #else
      firebase::App* app = firebase::App::Create(firebase::AppOptions());
    #endif  // defined(__ANDROID__)
    
  3. 获取您的 firebase::App 对应的 firebase::auth::Auth 类。AppAuth 是一对一的映射关系。
    firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
    
  • 调用 Auth::SignInAnonymously
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInAnonymously();
    
  • 如果您的程序有定期(如每秒 30 次或 60 次)运行的更新循环,则您可以在每次更新时利用 Auth::SignInAnonymouslyLastResult 检查一次结果:
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInAnonymouslyLastResult();
    if (result.status() == firebase::kFutureStatusComplete) {
      if (result.error() == firebase::auth::kAuthErrorNone) {
        firebase::auth::AuthResult auth_result = *result.result();
        printf("Sign in succeeded for `%s`\n",
               auth_result.user.display_name().c_str());
      } else {
        printf("Sign in failed with error '%s'\n", result.error_message());
      }
    }
    
    或者,如果您的程序是由事件驱动的,您可能需要注册一个针对 Future 的回调
  • 将匿名帐号转成永久帐号

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

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

      Google 登录
      firebase::auth::Credential credential =
          firebase::auth::GoogleAuthProvider::GetCredential(google_id_token,
                                                            nullptr);
      
      Facebook 登录
      firebase::auth::Credential credential =
          firebase::auth::FacebookAuthProvider::GetCredential(access_token);
      
      电子邮件地址/密码登录
      firebase::auth::Credential credential =
          firebase::auth::EmailAuthProvider::GetCredential(email, password);
      
    3. auth::Credential 对象传递给登录用户的 LinkWithCredential 方法:

      // Link the new credential to the currently active user.
      firebase::auth::User current_user = auth->current_user();
      firebase::Future<firebase::auth::AuthResult> result =
          current_user.LinkWithCredential(credential);
      

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

    自动清理

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

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

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

    后续步骤

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