启用 reCAPTCHA Enterprise

本文档介绍了如何使用 Identity Platform 与 reCAPTCHA 的集成来增强用户的安全性。 此功能可提高您的应用防范垃圾内容、滥用行为和其他欺诈活动的弹性。

Identity Platform 与 reCAPTCHA 的集成会代表您创建 reCAPTCHA 评估,以验证用户请求。 如需了解价格信息,请参阅 reCAPTCHA 价格

概览

当您配置 Identity Platform 与 reCAPTCHA 的集成时,Identity Platform 会预配 基于得分的 reCAPTCHA 网站密钥。 当用户使用以下任何操作访问您的应用或网站时: 客户端 SDK 加载 reCAPTCHA:

操作 方法
电子邮件地址和密码登录 signInWithPassword
电子邮件地址和密码注册 signUpPassword
电子邮件链接登录 getOobCode
重设密码 getOobCode

然后,reCAPTCHA 向 Identity Platform 提供风险信号 根据您的配置和风险容忍度评估请求风险。

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

准备工作

为用户配置电子邮件登录

创建服务账号

在启用 reCAPTCHA 之前,您必须为每个应用创建一个服务账号 这个项目将使用 reCAPTCHA 并为每个服务账号 访问 reCAPTCHA。这样,Identity Platform 就能管理 代表您 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 请求会被拒绝。 仅当将所有客户端迁移到具有如下支持的 SDK 后,才能启用强制执行: reCAPTCHA 支持。

如需启用 reCAPTCHA,请执行以下操作:

  1. 在项目中启用 reCAPTCHA API(如果您尚未启用)。
  2. 使用 Admin SDK 为项目启用 Identity Platform 与 reCAPTCHA 的集成。reCAPTCHA Node.js Admin SDK 11.7.0 及更高版本支持此功能。

    例如:

    // Get project config
    const getProjectConfig = () => {
      getAuth().projectConfigManager().getProjectConfig()
      .then((response) => {
        console.log('Project reCAPTCHA config: ', response.recaptchaConfig);
      }).catch((error) => {
        console.log('Error getting project config:', error);
      });
    }
    
    // Update project config with reCAPTCHA config
    const updateConfigRequest = {
      recaptchaConfig: {
        emailPasswordEnforcementState:  'AUDIT',
        managedRules: [{
          endScore: 0.3,
          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);
      });
    }
    
  3. 使用 Admin SDK 为租户启用 Identity Platform 与 reCAPTCHA 的集成。例如:

    // Update tenant with reCAPTCHA config
    const updateTenantRequest = {
      recaptchaConfig: {
        emailPasswordEnforcementState:  'AUDIT',
        managedRules: [{
          endScore: 0.3,
          action: 'BLOCK'
        }]
      }
    };
    const updateTenantWithRecaptchaConfig = () => {
      getAuth().tenantManager().updateTenant("TENANT_ID", updateTenantRequest)
      .then((response) => {
        console.log('Updated reCAPTCHA config for tenant: ', response.recaptchaConfig);
      }).catch((error) => {
        console.log('Error updating the tenant:', error);
      });
    }
    

    替换以下内容:

    • TENANT_ID:租户 ID
  4. 如果您在 Apple 平台或 Android 上使用 Identity Platform,则必须注册 在 Firebase 控制台中访问您的应用:

  5. 如果您使用的是 Web 版 Identity Platform,则必须为 每个使用 reCAPTCHA 的网域。如需添加已获授权的网域,请按以下步骤操作: 执行以下操作:

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

      转到 Identity Platform

    2. 前往设置 >安全性

    3. 点击添加网域

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

    网站密钥配置可能需要几分钟才能完成。为了确保 请查看指标

配置 Client SDK

根据应用的平台配置 Client SDK。

网页

  1. 更新至最新版本的 Web SDK。 JavaScript SDK 9.20.0 及更高版本支持 reCAPTCHA。 将 Web SDK 与您的应用集成后,它会自动获取 您的 reCAPTCHA 配置,并保护您已配置的提供商。

  2. 为了减少 SDK 发出的网络调用次数并改进 reCAPTCHA 信号收集,建议您对其进行配置 如下所示:

    import { initializeRecaptchaConfig } from '@firebase/auth';
    
    // Initialize Firebase Auth
    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 31.5.0 或更高版本。 要支持 reCAPTCHA,您需要 API 级别 19 (KitKat) 或更高级别,以及 Android 4.4 或更高版本。 将 Android SDK 与您的应用集成后,它会自动抓取 您的 reCAPTCHA 配置,并保护您已配置的提供商。

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

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

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

  3. 为了减少 SDK 发出的网络调用次数并确保使用 reCAPTCHA 为了更有效地收集信号,我们建议您进行明确配置,如下所示:

    • Kotlin:
    // Initialize Firebase Auth
    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 Auth
    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 10.14.0 或更高版本。 将 iOS SDK 与您的应用集成后,它会自动获取 您的 reCAPTCHA 配置,并保护您已配置的提供商。

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

  3. 确保链接器标志上列出了 -ObjC。导航至目标 > 构建设置 >全部 >关联并验证 Other Linker Flags 是否显示 -ObjC

  4. 为了减少 SDK 发出的网络调用次数并确保使用 reCAPTCHA 为了更有效地收集信号,我们建议您进行明确配置,如下所示:

    • Swift:
    // Initialize Firebase Auth
    try await Auth.auth().initializeRecaptchaConfig()
    
    • Objective-C:
    // Initialize Firebase Auth
    [[FIRAuth auth] initializeRecaptchaConfigWithCompletion:^(NSError * _Nullable error) {
      // Firebase Auth initialization finished
    }];
    

reCAPTCHA 指标

启用 reCAPTCHA 后,请监控 reCAPTCHA 指标 以确保身份验证流程受到保护。 如果 reCAPTCHA 网站密钥配置失败或需要服务 账号未能创建,reCAPTCHA 身份验证无法打开。

检查并确保 reCAPTCHA 身份验证可正常运行 项目发送到 Cloud Monitoring 的以下指标:

identitytoolkit.googleapis.com/recaptcha/verdict_count

跟踪 reCAPTCHA 返回的不同判定结果。如果存在令牌,系统会生成判定结果。 您可以按以下判定结果进行过滤:

  • PASSED:表示启用强制执行后允许给定请求。
  • FAILED_AUDIT:表示在 reCAPTCHA 时,给定请求被拒 审核模式已启用。
  • FAILED_ENFORCE:表示在 reCAPTCHA 时,给定请求被拒 强制执行模式。
  • CLIENT_TYPE_MISSING:表示给定请求缺少客户端 类型。这种情况通常发生 如果请求是使用未安装 reCAPTCHA 支持。
  • KEYS_MISSING:表示由于以下原因,无法验证给定请求: 检索或生成有效的 reCAPTCHA 密钥时, reCAPTCHA 强制执行已启用。

如需修改得分范围以更改通过判定结果与未通过判定的比率,请执行以下操作: 请参阅启用 reCAPTCHA Enterprise

identitytoolkit.googleapis.com/recaptcha/token_count

跟踪 Identity Platform 后端。您可以按以下状态进行过滤:

  • VALID:表示传入的 reCAPTCHA 令牌有效。
  • EXPIRED:表示传入的 reCAPTCHA 令牌已过期。 如果令牌过期,则可能表示客户端存在网络问题或滥用行为。
  • DUPLICATE:表示传入的 reCAPTCHA 令牌是 重复。重复的令牌可能表示客户端存在网络问题或滥用行为。
  • INVALID:表示传入的 reCAPTCHA 令牌无效。 如果令牌无效,则可能表示存在滥用行为。
  • MISSING:表示以下位置不存在 reCAPTCHA 令牌 指定请求。缺少令牌可能表示客户端应用已过时。
  • UNCHECKED:表示未检查 reCAPTCHA 令牌 因为 CLIENT_TYPE_MISSINGKEYS_MISSING 判定结果不同。

如果您的应用已成功向用户发布,您会看到带有有效令牌的流量。 有效令牌的数量可能与使用更新版应用的用户数成正比。

identitytoolkit.googleapis.com/recaptcha/risk_scores

跟踪 reCAPTCHA 得分分布。这有助于您确定 您的配置的最佳得分范围。

使用这些指标来确定是否可以启用强制执行。在启用强制执行之前,您应考虑以下事项:

  • 如果大多数最近的请求都有有效令牌,并且 PASSED 的比率 FAILED_AUDITFAILED_ENFORCE 判定结果对您的商家来说是可以接受的 请考虑启用强制执行。
  • 如果大多数近期请求都可能来自过时的客户端,请考虑 在启用强制执行前,系统会等待更多用户更新其应用。 强制执行 Identity Platform 与 reCAPTCHA 的集成会破坏未与 reCAPTCHA 集成的先前应用版本。

如需查看这些指标,请执行以下操作:

  1. 在 Google Cloud 控制台中,转到 Metrics Explorer 页面。

    转到 Metrics Explorer

  2. 选择指标中,输入 Identity Toolkit Tenant。 如果您使用的是多租户,则可以查看每个租户的指标, 以及父级项目,方法是将 tenant_name 留空。

启用强制执行

确认您的应用可以收到可接受的用户流量后, 您可以启用 reCAPTCHA 强制执行以保护您的用户。 确保您不会干扰现有用户,包括可能正在使用 旧版应用

如需为项目或租户启用 reCAPTCHA 强制执行,请按以下步骤操作: 使用 Admin SDK 运行以下命令:

const enforceRequest = {
  recaptchaConfig: {
    emailPasswordEnforcementState:  'ENFORCE',
    managedRules: [{
      endScore: 0.3,
      action: 'BLOCK'
    }]
  }
};

停用 reCAPTCHA

如需停用 reCAPTCHA,请使用 Admin SDK 运行以下命令:

const disableRequest = {
  recaptchaConfig: {
    emailPasswordEnforcementState:  'OFF',
  }
};

使用 Cloud Functions 替换 reCAPTCHA 判定结果

除了配置得分阈值之外,您还可以覆盖 使用自定义 Cloud Functions 函数屏蔽函数对给定令牌进行 reCAPTCHA 判定。 如果有指定用户的 reCAPTCHA 得分,这会非常有用 登录量可能很少,但该用户是受信任的用户,或者已通过其他 意味着可以完成登录。

如需详细了解如何使用 reCAPTCHA 配置屏蔽函数, 请参阅使用 Cloud Functions 屏蔽函数扩展 Firebase Authentication

问题排查

用户无法登录、注册或重置密码

用户可能使用的应用版本已过时。 如果您尚未提供使用 Client SDK 的应用更新版本, 立即关闭强制执行模式。否则,请让用户更新其应用。

或者,系统可能会根据您当前的配置屏蔽用户。请尝试以下操作:

  • 请考虑采用更宽松的配置,只需进行调整即可。 reCAPTCHA 密钥得分。
  • 让用户尝试其他设备、浏览器或网络。
  • 请先还原到审核模式并监控指标,然后再重新启用强制执行模式。