使用 Yahoo 和 C++ 进行身份验证

要让您的用户能够通过 OAuth 提供方(如 Yahoo)进行 Firebase 身份验证,您可以使用 Firebase SDK 执行端到端登录流程,将基于 Web 的通用 OAuth 登录机制集成到您的应用中。由于此流程需要使用基于电话的 Firebase SDK,因此它仅支持 Android 和 iOS。

准备工作

  1. 将 Firebase 添加至您的 C++ 项目
  2. 请务必在您的项目级 build.gradle 文件中的 buildscriptallprojects 部分添加 Google 的 Maven 代码库。
  3. Firebase 控制台中,打开身份验证部分。
  4. 登录方法标签页中,启用 Yahoo 提供方。
  5. 将该提供方的开发者控制台中的客户端 ID客户端密钥添加至提供方配置:
    1. 要注册 Yahoo OAuth 客户端,请按照关于如何通过 Yahoo 注册 Web 应用的 Yahoo 开发者文档进行操作。

      请务必选择两种 OpenID Connect API 权限:profileemail

    2. 通过这些提供方注册应用时,请务必将项目的 *.firebaseapp.com 网域注册为应用的重定向网域。
  6. 点击保存

访问 firebase::auth::Auth

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);
    

使用 Firebase SDK 处理登录流程

要使用 Firebase SDK 处理登录流程,请按以下步骤操作:

  1. 构造一个配置了适合 Yahoo 的提供方 ID 的 FederatedOAuthProviderData 实例。

    firebase::auth::FederatedOAuthProviderData
        provider_data(firebase::auth::YahooAuthProvider::kProviderId);
    
  2. 可选:指定您希望通过 OAuth 请求发送的其他自定义 OAuth 参数。

    // Prompt user to re-authenticate to Yahoo.
    provider_data.custom_parameters["prompt"] = "login";
    
    // Localize to French.
    provider_data.custom_parameters["language"] = "fr";
    

    要查看 Yahoo 支持的参数,请参阅 Yahoo OAuth 文档。 请注意,您不能使用 custom_parameters() 传递 Firebase 必需参数。这些参数包括 client_idredirect_uriresponse_typescopestate

  3. 可选:指定您希望向身份验证提供方申请的额外 OAuth 2.0 范围(超出 profileemail 范围)。如果您的应用需要从 Yahoo API 访问私有用户数据,您需要在 Yahoo 开发者控制台的 API 权限下申请 Yahoo API 的权限。申请的 OAuth 范围必须与应用的 API 权限中预配置的范围完全匹配。例如,如果您申请针对用户联系人的读/写权限,并已在应用的 API 权限中预配置相应权限,则必须传递 sdct-w 而不是只读 OAuth 范围 sdct-r。否则将导致流程失败,并向最终用户显示错误消息。

    // Request access to Yahoo Mail API.
    provider_data.scopes.push_back("mail-r");
    // This must be preconfigured in the app's API permissions.
    provider_data.scopes.push_back("sdct-w");
    

    要了解详情,请参阅 Yahoo 范围文档

  4. 提供方数据配置完成后,请使用它来创建 FederatedOAuthProvider。

    // Construct a FederatedOAuthProvider for use in Auth methods.
    firebase::auth::FederatedOAuthProvider provider(provider_data);
    
  5. 使用 Auth 提供方对象进行 Firebase 身份验证。请注意,与其他 FirebaseAuth 操作不同,此操作会弹出可供用户输入其凭据的网页视图,从而控制您的界面。

    要启动登录流程,请调用 signInWithProvider

    firebase::Future<firebase::auth::SignInResult> result =
      auth->SignInWithProvider(provider_data);
    

    然后,您的应用可能会等待或注册一个针对 Future 的回调

  6. 以上示例侧重的是登录流程。除此之外,您也可以使用 LinkWithProvider 将 Yahoo 提供方与现有用户相关联。例如,您可以将多个提供方关联至同一个用户,以便使用任意一个进行登录。

    firebase::Future<firebase::auth::SignInResult> result = user->LinkWithProvider(provider_data);
    
  7. 上述模式同样适用于 ReauthenticateWithProvider,它可用来为要求用户必须有近期登录才能执行的敏感操作检索新的凭据。

    firebase::Future<firebase::auth::SignInResult> result =
      user->ReauthenticateWithProvider(provider_data);
    

    然后,您的应用可能会等待或注册一个针对 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 实时数据库和 Cloud Storage 安全规则中,您可以从 auth 变量获取已登录用户的唯一用户 ID,然后利用此 ID 来控制用户可以访问哪些数据。

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

如需将用户退出登录,请调用 SignOut()

auth->SignOut();