如需让您的用户能够使用 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 Auth 支持的其他提供方不同,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();