将 Identity Platform 与 reCAPTCHA Enterprise API 集成
本文档介绍了如何将 Identity Platform 与 reCAPTCHA Enterprise API 集成,以增强用户安全性。此功能可让您的应用更有效地防范垃圾内容、滥用行为和其他欺诈性活动。
集成会代表您创建 reCAPTCHA Enterprise 评估,以验证用户请求。如需了解价格信息,请参阅 reCAPTCHA 价格。
概览
将 Identity Platform 与 reCAPTCHA Enterprise API 集成时,您会启用 reCAPTCHA 的默认保护功能,即 reCAPTCHA 机器人保护。启用机器人防护功能后,Identity Platform 会代表您在项目中预配基于得分的 reCAPTCHA 密钥。当用户通过以下任一操作访问您的应用或网站时,如果启用了相应的提供程序,客户端 SDK 就会加载 reCAPTCHA。
提供商 | 操作 | 方法 |
---|---|---|
passwordProvider |
电子邮件地址和密码登录 | signInWithPassword |
电子邮件地址和密码注册 | signUpPassword |
|
电子邮件链接登录 | getOobCode |
|
重设密码 | getOobCode |
|
phoneProvider |
电话号码注册或登录 | sendVerificationCode |
MFA 手机号码注册 | mfaSmsEnrollment |
|
MFA 手机号码登录 | mfaSmsSignIn |
然后,reCAPTCHA 会根据您的配置和风险承受能力,向 Identity Platform 提供评估请求风险的得分。
如需了解详情,请参阅 reCAPTCHA 概览。
准备工作
根据您要使用 reCAPTCHA 保护的身份验证流程类型,确保您已设置以下内容:
- 对于电子邮件地址-密码身份验证流程,请确保您已为用户配置电子邮件地址登录功能。
对于基于短信的身份验证流程,请确保您已加入以下至少一项计划:
- 为用户启用手机登录功能。
- 为您的 Web、Android 或 iOS 应用启用多重身份验证。
创建服务账号
Identity Platform 与 reCAPTCHA Enterprise API 的集成需要为每个将使用 reCAPTCHA 的项目提供 Identity Platform 服务账号。这样一来,Identity Platform 就可以代表您管理 reCAPTCHA 密钥。 如果您已创建服务账号,请向其授予对 reCAPTCHA 的访问权限。
如果您尚未创建服务账号,或者有其他项目需要使用 reCAPTCHA 进行保护,请执行以下操作:
使用 Google Cloud CLI 创建服务账号:
gcloud beta services identity create \ --service=identitytoolkit.googleapis.com \ --project=PROJECT_ID
将
PROJECT_ID
替换为项目 ID。为该服务账号授予对 reCAPTCHA 的访问权限:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-identitytoolkit.iam.gserviceaccount.com \ --role=roles/identitytoolkit.serviceAgent
替换以下内容:
PROJECT_ID
:项目 IDPROJECT_NUMBER
:项目账号
reCAPTCHA 机器人防护模式
reCAPTCHA 漫游器保护功能有两种模式,可帮助您保护用户:审核和强制执行。这些模式的行为因身份提供方而异。
电子邮件地址与密码提供方
对于电子邮件地址-密码身份验证流程,审核模式和强制执行模式的行为如下。
审核模式
当您将电子邮件地址-密码强制执行设置为审核模式时,Identity Platform 会在您的项目中创建一个或多个 reCAPTCHA 密钥,用于评估 Identity Platform API 的流量,而不会阻止任何请求。使用在审核模式下发出的指标来确定是否应启用 reCAPTCHA 强制执行。
强制模式
当您将电子邮件地址-密码强制执行设置为强制模式时,Identity Platform 会在您的项目中创建一个或多个 reCAPTCHA 密钥,用于评估 Identity Platform API 的流量。不包含 reCAPTCHA 令牌的 API 请求会被拒绝。只有在您将所有客户端迁移到支持 reCAPTCHA 的 SDK 后,才能启用强制执行。
电话服务提供商
对于手机身份验证流程,审核模式和强制执行模式的行为如下所示。
审核模式
当您将手机身份验证强制执行模式设置为审核模式时,Identity Platform 会使用 reCAPTCHA 机器人保护功能进行应用验证。如果用户请求通过了话费欺诈评估,系统会发送短信验证码。如果用户的请求未通过话费欺诈评估,并且您使用的是客户端 SDK,Identity Platform 会触发备用验证方法来完成手机身份验证流程。接受的后备方法取决于应用的平台。
在以下情况下,客户端 SDK 会触发备用验证方法:
- 缺少 reCAPTCHA 令牌。
- reCAPTCHA 令牌无效或已过期。
- reCAPTCHA 令牌未通过得分阈值。
- reCAPTCHA 未正确配置。
确保为应用平台设置了备用验证方法,并且这些方法已准备就绪,可在必要时由客户端 SDK 触发。
Web
如果初始漫游器保护评估失败,审核模式会依赖 reCAPTCHA v2 进行验证。因此,您必须设置 reCAPTCHA 验证程序 (RecaptchaVerifier
),并将其传递给以下手机身份验证操作:
verifyPhoneNumber
signInWithPhoneNumber
linkWithPhoneNumber
reauthenticateWithPhoneNumber
auth/argument-error
。如需详细了解如何设置 reCAPTCHA 验证程序,请参阅 Firebase 文档中的设置 reCAPTCHA 验证程序。
Android
如果初始机器人保护评估失败,审核模式会根据 Play Integrity API 验证您的应用。如果此验证失败,系统会触发 reCAPTCHA v2。 在以下情况下,可能会触发 reCAPTCHA v2:
- 如果最终用户的设备未安装 Google Play 服务。
- 如果相关应用未通过 Google Play 商店分发(针对 Authentication SDK 21.2.0 及更高版本)。
- 如果获得的 SafetyNet 令牌无效(针对 21.2.0 之前的 Authentication SDK 版本)。
iOS
如果初始机器人保护评估失败,审核模式会依赖静默推送通知进行验证。此验证方法涉及通过静默推送通知向请求设备上的应用发送令牌。如果您的应用成功收到通知,则会继续执行手机身份验证流程。如果您的应用未收到推送通知,系统会触发 reCAPTCHA v2。 如果未正确配置静默推送通知,则可能会触发 reCAPTCHA v2。
如需详细了解如何设置 iOS 应用验证,请参阅 Firebase 文档中的启用应用验证。
强制模式
当您将手机身份验证强制执行模式设置为“强制”模式时,Identity Platform 会使用 reCAPTCHA 机器人防护功能进行应用验证。如果用户请求通过了话费欺诈评估,系统会发送短信验证码。如果用户请求未通过话费欺诈评估,Identity Platform 会阻止该请求,并且不会发送包含验证码的短信。
在强制执行模式下,无需进行回退验证,您无需为应用设置任何其他验证方法。不过,我们建议为 Web 应用设置 reCAPTCHA 验证器,以确保在您决定将应用的 reCAPTCHA 模式更改为 AUDIT
或 OFF
时,reCAPTCHA v2 处于启用状态。
设置 Identity Platform 与 reCAPTCHA Enterprise API 的集成
如需设置 Identity Platform 与 reCAPTCHA Enterprise API 的集成,请执行以下任务:
- 使用 Admin SDK 设置 reCAPTCHA 强制执行状态并启用漫游器保护。
- 为应用的平台配置客户端 SDK。
我们建议您先在审核模式下启用 reCAPTCHA 强制执行,然后监控项目发出的 reCAPTCHA 指标,以确保身份验证流程得到适当保护。这样做是为了在审核用户对 reCAPTCHA 的使用情况时,不会中断用户流量。验证身份验证流程是否受到保护后,将机器人保护设置为 ENFORCE
。
启用 reCAPTCHA 机器人防护
电子邮件地址与密码提供方
如需为电子邮件密码身份验证流程启用 reCAPTCHA 机器人防护,请执行以下操作:
如果您尚未在项目中启用 reCAPTCHA Enterprise API,请先启用。
如需为项目启用机器人保护功能,请使用 Admin SDK。Node.js Admin SDK 11.7.0 版及更高版本支持 reCAPTCHA。
例如:
// Update project config with reCAPTCHA config const updateConfigRequest = { recaptchaConfig: { emailPasswordEnforcementState: 'ENFORCE_MODE', managedRules: [{ endScore: END_SCORE, action: 'BLOCK' }] } }; const updateProjectConfigWithRecaptcha = () => { getAuth().projectConfigManager().updateProjectConfig(updateConfigRequest).then((response) => { console.log('Updated reCAPTCHA config for project: ', response.recaptchaConfig); }).catch((error) => { console.log('Error updating project config:', error); }); }
替换以下内容:
ENFORCE_MODE
:您要为 reCAPTCHA 电子邮件-密码身份验证强制执行设置的模式。 有效值为OFF
、AUDIT
和ENFORCE
。如需启用机器人防护,此参数必须设置为AUDIT
或ENFORCE
。首次启用机器人保护功能时,建议将此参数设置为AUDIT
,并确保身份验证流程受到保护,然后再将此参数设置为ENFORCE
。如需详细了解这些模式的运作方式,请参阅 reCAPTCHA 机器人防护模式。END_SCORE
:请求在失败之前可获得的最低机器人保护评估得分。您可以将此得分设置为介于0.0
和1.0
之间的值。例如,如果您将阈值设置为0.6
,则 reCAPTCHA 会使任何得分为0.5
或更低的请求失败。因此,您设置的分数越高,规则就越严格。
您还可以使用 Admin SDK,通过相同的配置方法为租户启用机器人保护功能。如需详细了解如何更新租户,请参阅更新租户。
如果您在 iOS 或 Android 上使用 Identity Platform,则必须通过 Firebase 控制台注册您的应用:
- 对于 iOS,注册使用 Identity Platform 的每个软件包 ID
- 对于 Android,注册使用 Identity Platform 的每个 Android 软件包名称
如果您在网页上使用 Identity Platform,则必须为使用 reCAPTCHA 的每个网域添加已获授权的网域。如需添加授权网域,请执行以下操作:
在 Google Cloud 控制台中,前往 Identity Platform 页面。
依次前往设置 > 安全。
点击添加网域。
输入域名,然后点击添加以保存该域名。
reCAPTCHA 密钥配置可能需要几分钟才能完成。
如果您已将强制执行模式设置为审核模式,建议您监控用于防范机器人的 reCAPTCHA 指标,以确保您的流程受到保护。
电话服务提供商
如需为基于短信的身份验证流程启用 reCAPTCHA 机器人防护,请执行以下操作:
如果您尚未在项目中启用 reCAPTCHA Enterprise API,请先启用。
如需为项目启用机器人保护功能,请使用 Admin SDK。Node.js Admin SDK 12.7.0 版及更高版本支持 reCAPTCHA。
例如:
// Update project config with reCAPTCHA config const updateProjectConfigRequest = { recaptchaConfig: { phoneEnforcementState: 'ENFORCE_MODE', managedRules: [{ endScore: END_SCORE, action: 'BLOCK' }], useSmsBotScore: 'true', } } let projectConfig = await getAuth().projectConfigManager().updateProject(updateProjectConfigRequest);
替换以下内容:
ENFORCE_MODE
:您要为 reCAPTCHA 手机身份验证强制执行设置的模式。有效值为OFF
、AUDIT
和ENFORCE
。如需为基于短信的流程启用机器人防护,此参数必须设置为AUDIT
或ENFORCE
,并且useSmsBotScore
必须设置为true
。首次启用机器人保护功能时,建议将此参数设置为
AUDIT
,并确保身份验证流程受到保护,然后再将此参数设置为ENFORCE
。如需详细了解这些模式的运作方式,请参阅 reCAPTCHA 机器人防护模式。END_SCORE
:请求在失败之前可获得的最低机器人保护评估得分。您可以将此得分设置为介于0.0
和1.0
之间的值。例如,如果您将阈值设置为0.6
,则 reCAPTCHA 会使任何得分为0.5
或更低的请求失败。因此,您设置的分数越高,规则就越严格。
您还可以使用 Admin SDK,通过相同的配置方法为租户启用机器人保护功能。如需详细了解如何更新租户,请参阅更新租户。
如果您在 iOS 或 Android 上使用 Identity Platform,则必须通过 Firebase 控制台注册您的应用:
- 对于 iOS,注册使用 Identity Platform 的每个软件包 ID
- 对于 Android,注册使用 Identity Platform 的每个 Android 软件包名称
如果您在 Web 上使用 Identity Platform,则必须为使用 reCAPTCHA 的每个网域添加已获授权的网域。如需添加已获授权的网域,请执行以下操作:
在 Google Cloud 控制台中,前往 Identity Platform 页面。
依次前往设置 > 安全。
点击添加网域。
输入域名,然后点击添加以保存该域名。
reCAPTCHA 密钥配置可能需要几分钟才能完成。
如果您已将强制执行模式设置为审核模式,建议您监控用于防范机器人的 reCAPTCHA 指标,以确保您的流程受到保护。
配置客户端 SDK
根据应用的平台配置客户端 SDK。
Web
更新到最新版本的 Web SDK。
- JavaScript SDK 9.20.0 版及更高版本支持在 Web 应用中对电子邮件地址和密码身份验证使用 reCAPTCHA。
- JavaScript SDK 11 版及更高版本支持在 Web 应用中通过 手机号码进行身份验证。
将 Web SDK 与应用集成后,该 SDK 会自动提取 reCAPTCHA 配置,并为已配置的提供方启用保护功能。
如果需要,您可以强制提取 reCAPTCHA 信号,如下所示:
import { initializeRecaptchaConfig } from '@firebase/auth'; // Initialize Firebase Authentication const auth = getAuth(); initializeRecaptchaConfig(auth) .then(() => { console.log("Recaptcha Enterprise Config Initialization successful.") }) .catch((error) => { console.error("Recaptcha Enterprise Config Initialization failed with " + error) });
Android
更新到最新版本的 Android SDK。Android SDK 版本 23.1.0 及更高版本支持在 Android 应用中通过电子邮件地址和密码进行身份验证以及通过手机进行身份验证时使用 reCAPTCHA。
此外,reCAPTCHA 支持需要 API 级别 23 (Marshmallow) 或更高级别以及 Android 6 或更高版本。
将 Android SDK 与应用集成后,该 SDK 会自动提取 reCAPTCHA 配置,并为已配置的提供程序启用保护功能。
将以下 build 规则添加到应用级
build.gradle
文件的依赖项部分:implementation 'com.google.android.recaptcha:recaptcha:18.5.1'
请务必使用 reCAPTCHA SDK 版本 18.5.1 或更高版本。
如果需要,您可以强制提取 reCAPTCHA 信号,如下所示:
- Kotlin:
// Initialize Firebase Authentication auth = Firebase.auth auth.initializeRecaptchaConfig().addOnCompleteListener(this) { task -> if (task.isSuccessful) { Log.d(TAG, "Recaptcha Enterprise Initialization successful.") } else { Log.w(TAG, "Recaptcha Enterprise Initialization failed.") } }
- Java:
// Initialize Firebase Authentication auth = FirebaseAuth.getInstance(); auth.initializeRecaptchaConfig().addOnCompleteListener( this, new OnCompleteListener<void>() { @Override public void onComplete(@NonNull Task<void> task) { if (task.isSuccessful()) { Log.d(TAG, "Recaptcha Enterprise Initialization successful."); } else { Log.w(TAG, "Recaptcha Enterprise Initialization failed."); } } });
iOS
更新到 iOS SDK 版本 11.6.0 或更高版本。 将 iOS SDK 与应用集成后,该 SDK 会自动提取 reCAPTCHA 配置,并为已配置的提供程序启用保护功能。
如需将 reCAPTCHA iOS SDK 集成到您的应用中,请参阅准备环境。
确保链接器标志中列出了
-ObjC
。依次前往目标 > 构建设置 > 所有 > 链接,然后验证Other Linker Flags
是否显示-ObjC
。如果需要,您可以强制提取 reCAPTCHA 信号,如下所示:
- Swift:
// Initialize Firebase Authentication try await Auth.auth().initializeRecaptchaConfig()
- Objective-C:
// Initialize Firebase Authentication [[FIRAuth auth] initializeRecaptchaConfigWithCompletion:^(NSError * _Nullable error) { // Firebase Authentication initialization finished }];
监控 reCAPTCHA 指标以实现机器人防护
在将 reCAPTCHA 强制执行模式设置为“强制”模式之前,我们建议您使用审核模式并监控项目发出的 reCAPTCHA 指标,以确保身份验证流程受到保护。例如,这些指标可帮助您确定是否已正确设置 Identity Platform 与 reCAPTCHA Enterprise API 的集成。它们还可以帮助您针对用户流量微调得分阈值。如果 reCAPTCHA 密钥配置失败或未创建所需的服务账号,reCAPTCHA 身份验证尝试仍会正常成功。
检查项目向 Cloud Monitoring 发出的以下指标,确保 reCAPTCHA 身份验证正常运行:
identitytoolkit.googleapis.com/recaptcha/verdict_count
:跟踪 reCAPTCHA 返回的不同判定结果。identitytoolkit.googleapis.com/recaptcha/token_count
:跟踪 Identity Platform 后端收到的 reCAPTCHA 令牌的数量和状态。identitytoolkit.googleapis.com/recaptcha/risk_scores
:跟踪机器人保护得分分布。
如需了解详情,请参阅监控 reCAPTCHA 指标。
强制执行 reCAPTCHA 机器人防护
在验证您的应用接收的用户流量可接受后,您可以启用 reCAPTCHA 强制执行来保护用户。确保您不会打扰现有用户,包括可能正在使用旧版应用的用户。
电子邮件地址与密码提供方
如需在项目或租户中针对电子邮件地址-密码身份验证流程启用 reCAPTCHA 强制执行,请使用 Admin SDK 运行以下命令:
const enforceRequest = {
recaptchaConfig: {
emailPasswordEnforcementState: 'ENFORCE',
}]
}
};
电话服务提供商
如需在项目或租户中针对基于短信的身份验证流程启用 reCAPTCHA 强制执行,请使用 Admin SDK 运行以下命令:
const enforceRequest = {
recaptchaConfig: {
phoneEnforcementState: 'ENFORCE',
useSmsBotScore: 'true'
}]
}
};
停用 reCAPTCHA 机器人防护
电子邮件地址与密码提供方
如需针对电子邮件地址-密码身份验证流程停用机器人保护功能,请使用 Admin SDK 运行以下命令:
const disableRequest = {
recaptchaConfig: {
emailPasswordEnforcementState: 'OFF',
}
};
电话服务提供商
如需针对基于短信的身份验证流程停用机器人保护功能,请使用 Admin SDK 运行以下命令:
const disableRequest = {
recaptchaConfig: {
phoneEnforcementState: 'OFF',
useSmsBotScore: 'false'
}
};
使用 Cloud Run 函数替换 reCAPTCHA 判定结果
除了配置分数阈值之外,您还可以使用自定义 Cloud Run functions 屏蔽函数来替换给定令牌的 reCAPTCHA 判定结果。在以下情况下,此功能非常有用:特定用户登录的 reCAPTCHA 得分可能较低,但该用户受信任或已通过其他方式验证,因此允许其完成登录。
如需详细了解如何使用 reCAPTCHA 配置屏蔽函数,请参阅使用 Cloud Functions 屏蔽函数扩展 Firebase Authentication。
后续步骤
- 为基于短信的身份验证流程启用 reCAPTCHA SMS defense。
- 了解如何使用自己的 reCAPTCHA 密钥。
- 详细了解如何监控 reCAPTCHA 指标。
- 详细了解 reCAPTCHA。