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

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

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

准备工作

  1. 将 Firebase 添加到您的 C++ 项目
  2. Firebase 控制台中,打开身份验证部分。
  3. 登录方法标签页中,启用 Microsoft 提供方。
  4. 将该提供方的开发者控制台中的客户端 ID客户端密钥添加到提供方配置:
    1. 如需注册 Microsoft OAuth 客户端,请按照快速入门:使用 Azure Active Directory v2.0 端点注册应用中的说明进行操作。 请注意,此端点同时支持使用 Microsoft 个人帐号和 Azure Active Directory 帐号进行登录。 详细了解 Azure Active Directory v2.0。
    2. 通过这些提供方注册应用时,请务必将项目的 *.firebaseapp.com 网域注册为应用的重定向网域。
  5. 点击保存

访问 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. 构造一个配置了适合 Microsoft 的提供方 ID 的 FederatedOAuthProviderData 实例。

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

    // Prompt user to re-authenticate to Microsoft.
    provider_data.custom_parameters["prompt"] = "login";
    
    // Target specific email with login hint.
    provider_data.custom_parameters["login_hint"] =
        "user@firstadd.onmicrosoft.com";
    

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

    如需仅允许来自特定 Azure AD 租户的用户登录应用,可以使用 Azure AD 租户的易记域名或该租户的 GUID 标识符。为此,您可以在自定义参数对象中指定“租户”字段。

    // Optional "tenant" parameter in case you are using an Azure AD tenant.
    // eg. '8eaef023-2b34-4da1-9baa-8bc8c9d6a490' or 'contoso.onmicrosoft.com'
    // or "common" for tenant-independent tokens.
    // The default value is "common".
    provider_data.custom_parameters["tenant"] ="TENANT_ID";
    
  3. 可选:指定您希望向身份验证提供方申请获取的个人资料基本信息以外的额外 OAuth 2.0 范围。

    provider_data.scopes.push_back("mail.read");
    provider_data.scopes.push_back("calendars.read");
    

    如需了解详情,请参阅 Microsoft 权限和许可文档

  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 的回调

    使用 OAuth 访问令牌,您可以调用 Microsoft Graph API

    与 Firebase 身份验证支持的其他提供方不同,Microsoft 不提供照片网址,您必须通过 Microsoft Graph API 来请求个人资料照片的二进制数据。

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

    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 Realtime Database 和 Cloud Storage 安全规则中,您可以从 auth 变量获取已登录用户的唯一用户 ID,然后利用此 ID 来控制用户可以访问哪些数据。

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

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

auth->SignOut();