将 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 提供得分,以便 Identity Platform 根据您的配置和风险容忍度评估请求的风险。

如需了解详情,请参阅 reCAPTCHA 概览

准备工作

根据您要使用 reCAPTCHA 保护的身份验证流程类型,确保您已设置以下内容:

创建服务账号

若要将 Identity Platform 与 reCAPTCHA Enterprise API 集成,则需要为将使用 reCAPTCHA 的每个项目创建一个 Identity Platform 服务账号。这样,Identity Platform 就可以代表您管理 reCAPTCHA 密钥。如果您已创建服务账号,请向其授予对 reCAPTCHA 的访问权限。

如果您尚未创建服务账号,或者您有其他项目要使用 reCAPTCHA 进行保护,请执行以下操作:

  1. 使用 Google Cloud CLI 创建服务账号:

    gcloud beta services identity create \
        --service=identitytoolkit.googleapis.com \
        --project=PROJECT_ID
    

    PROJECT_ID 替换为项目 ID。

  2. 为该服务账号授予对 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:项目 ID
    • PROJECT_NUMBER:项目账号

reCAPTCHA 聊天机器人防范模式

reCAPTCHA 聊天机器人防范功能有两种模式可帮助您保护用户:审核强制执行。这些模式的行为因身份提供方而异。

电子邮件地址与密码提供商

对于电子邮件地址和密码身份验证流程,审核和强制执行模式的行为如下所示。

审核模式

当您将电子邮件地址和密码强制执行设置为审核模式时,Identity Platform 会在您的项目中创建一个或多个 reCAPTCHA 密钥,用于评估对 Identity Platform API 的流量,而不会阻止任何请求。您可以使用审核模式期间发出的指标来确定是否应启用 reCAPTCHA 强制执行。

强制模式

当您将电子邮件地址和密码强制执行设置为强制执行模式时,Identity Platform 会在您的项目中创建一个或多个 reCAPTCHA 密钥,用于评估对 Identity Platform API 的流量。不包含 reCAPTCHA 令牌的 API 请求将被拒绝。请仅在将所有客户端迁移到支持 reCAPTCHA 的 SDK 后启用强制执行。

电话提供商

对于手机身份验证流程,审核模式和强制执行模式的行为如下所示。

审核模式

当您将手机身份验证强制执行设置为审核模式时,Identity Platform 会使用 reCAPTCHA 机器人防范功能进行应用验证。如果用户请求通过了聊天机器人防范评估,Identity Platform 会向用户的手机发送一条包含验证码的短信。如果请求未通过聊天机器人防范评估,并且您使用的是客户端 SDK,系统会触发后备验证方法来完成手机身份验证流程。接受的回退方法取决于应用的平台。

客户端 SDK 会在以下情况下触发回退验证方法:

  • reCAPTCHA 令牌缺失。
  • reCAPTCHA 令牌无效或已过期。
  • reCAPTCHA 令牌未达到得分阈值。
  • reCAPTCHA 未正确配置。

确保已为应用的平台设置回退验证方法,并准备好在必要时由客户端 SDK 触发。

Web

如果初始聊天机器人防范评估失败,审核模式将依赖 reCAPTCHA v2 进行验证。因此,您必须设置 reCAPTCHA 验证程序 (RecaptchaVerifier),并将其传递给以下手机身份验证操作:

  • verifyPhoneNumber
  • signInWithPhoneNumber
  • linkWithPhoneNumber
  • reauthenticateWithPhoneNumber
如果没有 reCAPTCHA 验证程序,Identity Platform 将无法启动 reCAPTCHA v2,并会返回 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 版本)。
如需详细了解如何设置 Android 应用验证,请参阅 Firebase 文档中的启用应用验证

iOS

如果初始聊天机器人防范评估失败,审核模式将依赖于静默推送通知进行验证。此验证方法涉及使用静默推送通知向请求设备上的应用发送令牌。如果您的应用成功收到通知,手机身份验证流程会继续。如果您的应用未收到推送通知,系统会触发 reCAPTCHA v2。 如果未正确配置静默推送通知,系统可能会触发 reCAPTCHA v2。

如需详细了解如何设置 iOS 应用验证,请参阅 Firebase 文档中的启用应用验证

强制模式

当您将手机身份验证强制执行设置为强制模式时,Identity Platform 会使用 reCAPTCHA 机器人防范功能进行应用验证。如果用户请求通过了聊天机器人防范评估,Identity Platform 会向用户的手机发送一条包含验证码的短信。如果请求未通过聊天机器人防范评估,Identity Platform 会屏蔽该请求,并且不会发送包含验证码的短信。

强制执行模式不需要回退验证,因此您无需为应用设置任何其他验证方法。不过,如果您决定将应用的 reCAPTCHA 模式更改为 AUDITOFF,我们建议您为 Web 应用设置 reCAPTCHA 验证器,以确保启用 reCAPTCHA v2。

设置 Identity Platform 与 reCAPTCHA Enterprise API 的集成

如需设置 Identity Platform 与 reCAPTCHA Enterprise API 的集成,您需要执行以下任务:

  • 使用 Admin SDK 设置 reCAPTCHA 强制执行状态并启用聊天机器人防范功能。
  • 为应用的平台配置客户端 SDK。

我们建议您先在审核模式下启用 reCAPTCHA 强制执行功能,然后监控项目发出的 reCAPTCHA 指标,以确保身份验证流程得到适当保护。这样做是为了避免在审核用户对 reCAPTCHA 的使用情况时中断用户流量。验证您的身份验证流程是否受保护后,将聊天机器人防范设置为 ENFORCE

启用 reCAPTCHA 聊天机器人防范功能

电子邮件地址与密码提供商

如需为电子邮件密码身份验证流程启用 reCAPTCHA 聊天机器人防范功能,请执行以下操作:

  1. 如果尚未执行此操作,请为您的项目启用 reCAPTCHA Enterprise API

  2. 如需为项目启用聊天机器人防范功能,请使用 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 电子邮件地址和密码身份验证强制执行设置的模式。有效值为 OFFAUDITENFORCE。如需启用聊天机器人防护,此参数必须设置为 AUDITENFORCE。首次启用聊天机器人防范功能时,我们建议您先将此参数设置为 AUDIT,确保您的身份验证流程受到保护,然后再将其设置为 ENFORCE。如需详细了解这些模式的运作方式,请参阅 reCAPTCHA 机器人防范模式
    • END_SCORE:请求在失败之前可以获得的最低聊天机器人防范评估得分。您可以将此得分设置为介于 0.01.0 之间。例如,如果您将阈值设置为 0.6,则 reCAPTCHA 会拒绝得分为 0.5 或更低的任何请求。因此,得分越高,规则就越严格。

    您还可以使用 Admin SDK 为tenant使用相同的配置方法启用聊天机器人防范功能。如需详细了解如何更新租户,请参阅更新租户

  3. 如果您在 iOS 或 Android 上使用 Identity Platform,则必须通过 Firebase 控制台注册应用:

    如果您在网站上使用 Identity Platform,则必须为使用 reCAPTCHA 的每个网域添加已获授权的网域。如需添加已获授权的网域,请执行以下操作:

    1. 在 Google Cloud 控制台中,前往 Identity Platform 页面。

      前往 Identity Platform

    2. 依次前往设置 > 安全

    3. 点击添加网域

    4. 输入域名,然后点击添加以保存域名。

    reCAPTCHA 密钥预配可能需要几分钟才能完成。

  4. 如果您已将强制执行设置为审核模式,我们建议您监控 reCAPTCHA 指标以防范聊天机器人,以确保您的流程受到保护。

电话提供商

如需为基于短信的身份验证流程启用 reCAPTCHA 聊天机器人防护,请执行以下操作:

  1. 如果尚未执行此操作,请为您的项目启用 reCAPTCHA Enterprise API

  2. 如需为项目启用聊天机器人防范功能,请使用 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 手机身份验证强制执行设置的模式。有效值为 OFFAUDITENFORCE。如需为基于短信的流程启用聊天机器人防范功能,此参数必须设置为 AUDITENFORCE,并且 useSmsBotScore 必须设置为 true

      首次启用聊天机器人防范功能时,我们建议您先将此参数设置为 AUDIT,确保您的身份验证流程受到保护,然后再将其设置为 ENFORCE。如需详细了解这些模式的运作方式,请参阅 reCAPTCHA 机器人防范模式

    • END_SCORE:请求在失败之前可以获得的最低聊天机器人防范评估得分。您可以将此得分设置为介于 0.01.0 之间。例如,如果您将阈值设置为 0.6,则 reCAPTCHA 会拒绝得分为 0.5 或更低的任何请求。因此,得分越高,规则就越严格。

    您还可以使用 Admin SDK 为tenant使用相同的配置方法启用聊天机器人防范功能。如需详细了解如何更新租户,请参阅更新租户

  3. 如果您在 iOS 或 Android 上使用 Identity Platform,则必须通过 Firebase 控制台注册应用:

    如果您在 Web 上使用 Identity Platform,则必须为使用 reCAPTCHA 的每个网域添加已获授权的网域。如需添加已获授权的网域,请执行以下操作:

    1. 在 Google Cloud 控制台中,前往 Identity Platform 页面。

      前往 Identity Platform

    2. 依次前往设置 > 安全

    3. 点击添加网域

    4. 输入域名,然后点击添加以保存域名。

    reCAPTCHA 密钥预配可能需要几分钟才能完成。

  4. 如果您已将强制执行设置为审核模式,我们建议您监控 reCAPTCHA 指标以防范聊天机器人,以确保您的流程受到保护。

配置客户端 SDK

根据应用的平台配置客户端 SDK。

Web

  1. 更新到最新版本的 Web SDK

    • JavaScript SDK 9.20.0 及更高版本支持在 Web 应用中使用 reCAPTCHA 进行电子邮件和密码身份验证
    • JavaScript SDK 11 及更高版本支持在 Web 应用中使用 reCAPTCHA 进行手机验证

    将 Web SDK 与应用集成后,该 SDK 会自动提取您的 reCAPTCHA 配置,并为您配置的提供方启用保护。

  2. 如果需要,您可以强制提取 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

  1. 请更新到最新版 Android SDK。Android SDK 23.1.0 及更高版本支持在 Android 应用中对电子邮件和密码身份验证以及手机身份验证使用 reCAPTCHA。

    此外,若要支持 reCAPTCHA,则需要 API 级别 23 (Marshmallow) 或更高级别以及 Android 6 或更高版本。

    将 Android SDK 与您的应用集成后,该 SDK 会自动提取您的 reCAPTCHA 配置,并为您配置的提供程序启用保护。

  2. 将以下构建规则添加到应用级 build.gradle 文件的依赖项部分:

    implementation 'com.google.android.recaptcha:recaptcha:18.5.1'
    

    请务必使用 reCAPTCHA SDK 18.5.1 或更高版本。

  3. 如果需要,您可以强制提取 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

  1. 更新到 iOS SDK 11.6.0 或更高版本。 将 iOS SDK 与您的应用集成后,SDK 会自动提取您的 reCAPTCHA 配置,并为您配置的提供程序启用保护。

  2. 如需将 reCAPTCHA iOS SDK 集成到您的应用,请参阅准备环境

  3. 确保链接器标志中列出了 -ObjC。依次前往目标 > 构建设置 > 所有 > 链接,然后验证 Other Linker Flags 是否显示 -ObjC

  4. 如果需要,您可以强制提取 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 身份验证正常运行:

如需了解详情,请参阅监控 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

后续步骤