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

使用自定义身份验证系统和 C++ 通过 Firebase 进行身份验证

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。
您可以将 Firebase 身份验证与自定义身份验证系统集成,方法是修改身份验证服务器以在用户成功登录时生成自定义签名令牌。您的应用接收此令牌并使用它向 Firebase 进行身份验证。

在你开始之前

  1. 将 Firebase 添加到您的 C++ 项目中。
  2. 获取项目的服务器密钥:
    1. 转到项目设置中的服务帐户页面。
    2. 点击服务帐户页面的Firebase Admin SDK部分底部的生成新私钥
    3. 新服务帐户的公钥/私钥对会自动保存在您的计算机上。将此文件复制到您的身份验证服务器。

使用 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::SignInWithCustomToken
  1. 当用户登录您的应用程序时,将他们的登录凭据(例如,他们的用户名和密码)发送到您的身份验证服务器。您的服务器检查凭据并在它们有效时返回自定义令牌
  2. 从身份验证服务器收到自定义令牌后,将其传递给Auth::SignInWithCustomToken以登录用户:
    firebase::Future<firebase::auth::User*> result =
        auth->SignInWithCustomToken(custom_token);
    
  3. 如果您的程序有一个定期运行的更新循环(例如每秒 30 或 60 次),您可以使用Auth::SignInWithCustomTokenLastResult :
    firebase::Future<firebase::auth::User*> result =
        auth->SignInWithCustomTokenLastResult();
    if (result.status() == firebase::kFutureStatusComplete) {
      if (result.error() == firebase::auth::kAuthErrorNone) {
        firebase::auth::User* user = *result.result();
        printf("Sign in succeeded for `%s`\n", user->display_name().c_str());
      } else {
        printf("Sign in failed with error '%s'\n", result.error_message());
      }
    }
    
    每次更新检查一次结果 或者,如果您的程序是事件驱动的,您可能更喜欢在 Future 上注册回调

下一步

用户首次登录后,会创建一个新用户帐户并将其链接到凭据(即用户名和密码、电话号码或身份验证提供商信息),即用户登录时使用的凭据。这个新帐户作为 Firebase 项目的一部分存储,可用于在项目中的每个应用中识别用户,无论用户如何登录。

  • 在您的应用程序中,您可以从firebase::auth::User对象获取用户的基本个人资料信息:

    firebase::auth::User* user = auth->current_user();
    if (user != nullptr) {
      std::string name = user->display_name();
      std::string email = user->email();
      std::string photo_url = user->photo_url();
      // The user's ID, unique to the Firebase project.
      // Do NOT use this value to authenticate with your backend server,
      // if you have one. Use firebase::auth::User::Token() instead.
      std::string uid = user->uid();
    }
    
  • 在您的 Firebase 实时数据库和云存储安全规则中,您可以从auth变量中获取登录用户的唯一用户 ID,并使用它来控制用户可以访问哪些数据。

您可以通过将身份验证提供程序凭据链接到现有用户帐户来允许用户使用多个身份验证提供程序登录您的应用程序。

要注销用户,请调用SignOut()

auth->SignOut();