如需让您的用户能够使用 OAuth 提供方(如 Microsoft Azure Active Directory)进行 Firebase 身份验证,您可以使用 Firebase SDK 执行端到端登录流程,将基于 Web 的通用 OAuth 登录机制集成到您的应用中。由于此流程需要使用基于电话的 Firebase SDK,因此它仅支持 Android 和 Apple 平台。
准备工作
- 将 Firebase 添加至您的 C++ 项目。
- 在 Firebase 控制台中,打开 Auth 部分。
- 在登录方法标签页中,启用 Microsoft 提供方。
- 将该提供方的开发者控制台中的客户端 ID 和客户端密钥添加至提供方配置:
- 如需注册 Microsoft OAuth 客户端,请按照快速入门:使用 Azure Active Directory v2.0 端点注册应用中的说明进行操作。 请注意,此端点同时支持使用 Microsoft 个人账号和 Azure Active Directory 账号进行登录。 详细了解 Azure Active Directory v2.0。
- 向这些提供方注册应用时,请务必将项目的
*.firebaseapp.com
网域注册为应用的重定向网域。
- 点击保存。
访问 firebase::auth::Auth
类
Auth
类是所有 API 调用都需要通过的门户。- 添加 Auth 和 App 头文件:
#include "firebase/app.h" #include "firebase/auth.h"
- 在您的初始化代码中,创建一个
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__)
- 获取您的
firebase::App
对应的firebase::auth::Auth
类。App
和Auth
是一对一的映射关系。firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
使用 Firebase SDK 处理登录流程
如需使用 Firebase SDK 处理登录流程,请按以下步骤操作:
构建一个配置了适用于 Microsoft 的提供方 ID 的
FederatedOAuthProviderData
实例。firebase::auth::FederatedOAuthProviderData provider_data(firebase::auth::MicrosoftAuthProvider::kProviderId);
可选:指定您希望通过 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_id、response_type、redirect_uri、state、scope 和 response_mode。如需仅允许来自特定 Azure AD 租户的用户登录应用,可以使用 Azure AD 租户的易记域名或该租户的 GUID 标识符。为此,您可以在自定义参数对象中指定“tenant”字段。
// 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";
可选:指定您希望向身份验证提供方申请获取的基本个人资料以外的额外 OAuth 2.0 范围。
provider_data.scopes.push_back("mail.read"); provider_data.scopes.push_back("calendars.read");
如需了解详情,请参阅 Microsoft 权限和许可文档。
提供方数据配置完成后,请使用它来创建
FederatedOAuthProvider
。// Construct a FederatedOAuthProvider for use in Auth methods. firebase::auth::FederatedOAuthProvider provider(provider_data);
使用 Auth 提供方对象进行 Firebase 身份验证。请注意,与其他 FirebaseAuth 操作不同,此操作会弹出可供用户输入其凭据的网页视图,从而控制您的界面。
如需启动登录流程,请调用
SignInWithProvider
:firebase::Future<firebase::auth::AuthResult> result = auth->SignInWithProvider(provider_data);
然后,您的应用可能会等待或注册一个针对 Future 的回调。
使用 OAuth 访问令牌,您可以调用 Microsoft Graph API。
与 Firebase Authentication 支持的其他提供方不同,Microsoft 不提供照片网址,您必须通过 Microsoft Graph API 来请求个人资料照片的二进制数据。
以上示例侧重的是登录流程。除此之外,您也可以使用
LinkWithProvider
将 Microsoft Azure Active Directory 提供方与现有用户相关联。例如,您可以将多个提供方与同一个用户关联,以便用户使用任一提供方服务进行登录。firebase::Future<firebase::auth::AuthResult> result = user.LinkWithProvider(provider_data);
上述模式同样适用于
ReauthenticateWithProvider
,它可用来为要求用户必须有近期登录才能执行的敏感操作检索新的凭据。firebase::Future<firebase::auth::AuthResult> result = user.ReauthenticateWithProvider(provider_data);
然后,您的应用可能会等待或注册一个针对 Future 的回调。
后续步骤
在用户首次登录后,系统会创建一个新的用户账号,并将其与该用户登录时使用的凭据(即用户名和密码、电话号码或者身份验证提供方信息)相关联。此新账号存储在您的 Firebase 项目中,无论用户采用何种方式登录,您项目中的每个应用都可以使用此账号来识别用户。
-
在您的应用中,您可以从
firebase::auth::User
对象获取用户的基本个人资料信息:firebase::auth::User user = auth->current_user(); if (user.is_valid()) { 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();