针对移动应用与 Google Cloud Armor 集成

本文档介绍了如何在移动应用中将 reCAPTCHA 的 WAF 功能与 Google Cloud Armor 集成。

如需完成集成,您必须实现 reCAPTCHA for WAF 的一项或多项功能,并配置 Google Cloud Armor 安全政策。不过,您只能在移动应用中实现 reCAPTCHA 操作令牌,以便与 Google Cloud Armor 集成。

准备工作

  1. 启用 reCAPTCHA Enterprise API。

    Enable the API

  2. 确定您要保护的操作。

实现 reCAPTCHA 操作令牌

您必须在移动应用上运行 reCAPTCHA 才能生成 操作令牌。 reCAPTCHA 生成操作令牌后,您将操作令牌附加到预定义的 请求标头以保护任何用户操作,例如 checkout。默认情况下,操作令牌的有效期为 30 分钟,但可能会因流量而异。 您必须在操作令牌到期之前将其附加到预定义的请求标头,使得 Google Cloud Armor 可以评估令牌属性。

如需实现 reCAPTCHA 操作令牌,请执行以下操作:

  1. 为您的移动应用创建操作令牌密钥。

    控制台

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

      前往 reCAPTCHA

    2. 验证项目名称是否显示在页面顶部的项目选择器中。

      如果您没有看到项目名称,请点击资源选择器,然后选择您的项目。

    3. 点击创建密钥
    4. 显示名字段中,输入密钥的显示名。
    5. 根据您要为其创建 WAF 的 reCAPTCHA 密钥的应用类型,执行适当的操作:
    6. 为 iOS 应用的 WAF 创建 reCAPTCHA 密钥

      我们建议您为每个 iOS 应用创建一个 reCAPTCHA 密钥。

      1. 选择平台类型菜单中,选择 iOS 应用
        1. iOS 软件包 ID 列表部分,点击添加 iOS 软件包 ID
        2. Bundle ID(软件包 ID)字段中,输入您的 iOS 软件包的名称 ID。

        3. 可选:如需添加其他软件包 ID,请点击添加 iOS 软件包 ID,然后在软件包 ID 字段中输入 iOS 软件包 ID 的名称。
        4. 可选:提供 Apple Developer 设置

          我们建议您提供此数据,因为借助此数据,reCAPTCHA 可为您的流量提供更准确的风险评分。

          输入以下信息:

          • 私钥 (.p8):此密钥是在 Apple Developer Center 的“证书、标识符和个人资料”下生成的。
          • 密钥标识符:Apple 开发者密钥标识符(10 位字符的字符串)。
          • 团队 ID:此配置的 Apple 团队 ID(10 个字符的字符串) 用于构建应用的配置文件。
        5. 展开软件包 ID 验证和密钥类型
          1. 如需为 WAF 创建 reCAPTCHA 密钥,请执行以下操作:
            1. 开启 Web 应用防火墙 (WAF) 切换开关。
            2. 服务菜单中,选择 Cloud Armor
            3. 功能菜单中选择操作令牌
          2. 为了保护软件包 ID 的 reCAPTCHA 密钥,请确保 停用软件包 ID 验证切换开关处于关闭状态。
          3. 对于非生产环境,如果您想指定希望将密钥 要在其创建任何评估后返回,请执行以下操作:

            1. 点击这是一个测试密钥切换开关。
            2. Score(得分)框中,指定一个介于 0 到 1.0 之间的得分。
        6. 点击创建密钥
        7. 新创建的密钥会列在 reCAPTCHA 密钥页面上。

      为 Android 应用的 WAF 创建 reCAPTCHA 密钥

      1. 选择平台类型菜单中,选择 Android 应用
      2. Android 软件包列表部分中,点击添加 Android 软件包
      3. Android 软件包字段中,输入您的 Android 软件包的名称。
      4. 可选:要添加其他软件包,请点击添加 Android 软件包,然后在 Android 软件包字段中输入其他 Android 软件包的名称。
      5. 展开软件包名称验证、应用分发和测试密钥
        1. 如需为 WAF 创建 reCAPTCHA 密钥,请执行以下操作:
          1. 开启 Web 应用防火墙 (WAF) 切换开关。
          2. 服务菜单中,选择 Cloud Armor
          3. 功能菜单中选择操作令牌
        2. 如需强制要求 reCAPTCHA 密钥仅在您的应用中使用,请关闭停用软件包名称验证切换开关。
        3. 如果您想为除了 Google Play 商店之外的其他应用商店中提供的应用创建密钥,请开启支持在 Google Play 商店之外分发的应用
        4. 对于非生产环境,如果您想指定在为键创建任何评估时该键应返回的分数,请执行以下操作:

          1. 点击这是一个测试密钥切换开关。
          2. Score(得分)框中,指定一个介于 0 到 1.0 之间的得分。
      6. 点击创建密钥
      7. 新创建的密钥会列在 reCAPTCHA 密钥页面上。

    gcloud (iOS)

    如需创建 reCAPTCHA 密钥,请使用 gcloud recaptcha keys create 命令。

    在使用下面的命令数据之前,请先进行以下替换:

    • DISPLAY_NAME:密钥的名称。通常是网站名称。
    • BUNDLE_IDs:获准使用相应密钥的应用的 iOS 软件包 ID。 以英文逗号分隔的列表形式指定多个软件包 ID。
    • WAF_FEATURE:WAF 功能的名称。 指定 action-token
    • WAF_SERVICE: WAF 服务提供商。 为 Google Cloud Armor 指定 CA

    执行 gcloud recaptcha keys create 命令:

    Linux、macOS 或 Cloud Shell

    gcloud recaptcha keys create \
    --display-name=DISPLAY_NAME  \
    --ios --bundle-ids=BUNDLE_IDs \
    --waf-feature=WAF_FEATURE \
    --waf-service=WAF_SERVICE 

    Windows (PowerShell)

    gcloud recaptcha keys create `
    --display-name=DISPLAY_NAME  `
    --ios --bundle-ids=BUNDLE_IDs `
    --waf-feature=WAF_FEATURE `
    --waf-service=WAF_SERVICE 

    Windows (cmd.exe)

    gcloud recaptcha keys create ^
    --display-name=DISPLAY_NAME  ^
    --ios --bundle-ids=BUNDLE_IDs ^
    --waf-feature=WAF_FEATURE ^
    --waf-service=WAF_SERVICE 

    响应中包含新创建的 reCAPTCHA 密钥。

    gcloud(Android 版)

    如需创建 reCAPTCHA 密钥,请使用 gcloud recaptcha keys create 命令。

    在使用下面的命令数据之前,请先进行以下替换:

    • DISPLAY_NAME:密钥的名称。通常是网站名称。
    • PACKAGE_NAMES:获准使用该密钥的应用的 Android 软件包名称。以英文逗号分隔的列表形式指定多个软件包名称。
    • WAF_FEATURE:WAF 功能的名称。 指定 action-token
    • WAF_SERVICE:WAF 服务提供商的名称。 为 Google Cloud Armor 指定 CA

    执行 gcloud recaptcha keys create 命令:

    Linux、macOS 或 Cloud Shell

    gcloud recaptcha keys create \
    --display-name=DISPLAY_NAME  \
    --android --package-names=PACKAGE_NAMES \
    --waf-feature=WAF_FEATURE \
    --waf-service=WAF_SERVICE 

    Windows (PowerShell)

    gcloud recaptcha keys create `
    --display-name=DISPLAY_NAME  `
    --android --package-names=PACKAGE_NAMES `
    --waf-feature=WAF_FEATURE `
    --waf-service=WAF_SERVICE 

    Windows (cmd.exe)

    gcloud recaptcha keys create ^
    --display-name=DISPLAY_NAME  ^
    --android --package-names=PACKAGE_NAMES ^
    --waf-feature=WAF_FEATURE ^
    --waf-service=WAF_SERVICE 

    响应中包含新创建的 reCAPTCHA 密钥。

    REST (iOS)

    在使用任何请求数据之前,请先进行以下替换:

    • DISPLAY_NAME:密钥的名称。通常是应用名称。
    • BUNDLE_IDs:获准使用相应密钥的应用的 iOS 软件包 ID。 以英文逗号分隔的列表形式指定多个软件包 ID。
    • WAF_FEATURE:WAF 功能的名称。 指定 action-token
    • WAF_SERVICE: WAF 服务提供商。 为 Google Cloud Armor 指定 CA

    HTTP 方法和网址:

    POST https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/keys

    请求 JSON 正文:

    {
      "displayName": "DISPLAY_NAME",
      "iosSettings": {
     "allowedBundleIds": "BUNDLE_IDS"
     },
       'wafSettings': "  {
           "wafService": "CA",
     "wafFeature": "ACTION_TOKEN"
      }
     }
    
    

    如需发送请求,请选择以下方式之一:

    curl

    将请求正文保存在名为 request.json 的文件中,然后执行以下命令:

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/keys"

    PowerShell

    将请求正文保存在名为 request.json 的文件中,然后执行以下命令:

    $cred = gcloud auth print-access-token
    $headers = @{ "Authorization" = "Bearer $cred" }

    Invoke-WebRequest `
    -Method POST `
    -Headers $headers `
    -ContentType: "application/json; charset=utf-8" `
    -InFile request.json `
    -Uri "https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/keys" | Select-Object -Expand Content

    您应该收到类似以下内容的 JSON 响应:

    
    {
      "name": "projects/project-id/keys/6LfhtywnAAAAABY3sCS2duZ6A55kmDXz-PNEgKgT",
      "displayName": "DISPLAY_NAME",
      "iosSettings": {
        "allowAllBundleIds": false,
        "allowedBundleIds": [
            BUNDLE_IDS
        ]
      },
      "labels": {},
      "wafSettings": {
          "wafService": "CA",
          "wafFeature": "ACTION_TOKEN"
      }
    }
    
    

    REST (Android)

    在使用任何请求数据之前,请先进行以下替换:

    • DISPLAY_NAME:密钥的名称。通常是应用名称。
    • PACKAGE_NAMES:获准运行的应用的 Android 软件包名称 使用密钥。以英文逗号分隔的列表形式指定多个软件包名称。
    • WAF_FEATURE:WAF 功能的名称。 指定 action-token
    • WAF_SERVICE: WAF 服务提供商。 为 Google Cloud Armor 指定 CA

    HTTP 方法和网址:

    POST https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/keys

    请求 JSON 正文:

    {
      "displayName": "DISPLAY_NAME",
      "androidSettings": {
      "allowedPackageNames":"PACKAGE_NAMES"
     },
       'wafSettings': "  {
           "wafService": "CA",
     "wafFeature": "ACTION_TOKEN"
      }
     }
    
    

    如需发送请求,请选择以下方式之一:

    curl

    将请求正文保存在名为 request.json 的文件中,然后执行以下命令:

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/keys"

    PowerShell

    将请求正文保存在名为 request.json 的文件中,然后执行以下命令:

    $cred = gcloud auth print-access-token
    $headers = @{ "Authorization" = "Bearer $cred" }

    Invoke-WebRequest `
    -Method POST `
    -Headers $headers `
    -ContentType: "application/json; charset=utf-8" `
    -InFile request.json `
    -Uri "https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/keys" | Select-Object -Expand Content

    您应该收到类似以下内容的 JSON 响应:

    
    {
      "name": "projects/project-id/keys/6LcioSknAAAAABrjlMuZv2fjIGYMqwaAFC9izhoy",
      "displayName": "DISPLAY_NAME",
      "androidSettings": {
          "allowAllPackageNames": false,
          "allowedPackageNames": [
              PACKAGE_NAMES
          ],
          "supportNonGoogleAppStoreDistribution": false
      },
      "labels": {},
      "wafSettings": {
          "wafService": "CA",
          "wafFeature": "ACTION_TOKEN"
      }
    }
    
    

  2. 在您的移动应用中集成 reCAPTCHA 移动 SDK 您创建的操作令牌密钥。有关说明,请参阅 与您的移动应用的类型相对应

  3. 从 reCAPTCHA 收到令牌后,请附加令牌 预定义请求标头,格式如下:

    X-Recaptcha-Token: value-of-your-action-token
    

    以下示例代码展示了如何附加令牌:

    Android

    Java 中的示例代码

    // This example shows how to send an HTTP request to the backend server
    // attached with the reCAPTCHA token in the header.
    //
    // @param serverUrl: the URL of the backend server.
    // @param rceToken: reCAPTCHA token that is attached to the header of the
    // HTTP request.
    
    public static void sendRequestToServerWithRceToken(
        String serverUrl, String rceToken) throws JSONException, IOException {
     URL url = new URL(String.format("http://%s/decryptcaptchacookie/accesswafserver", serverUrl));
     HttpURLConnection connection = (HttpURLConnection) url.openConnection();
     connection.setRequestProperty("X-Recaptcha-Token", rceToken);
    
     try {
        String requestBody = "['']";
        sendRequest(connection, requestBody, "AccessWithRceToken", "GET");
     } finally {
        connection.disconnect();
     }
    }
    
    private static void sendRequest(
        HttpURLConnection connection, String requestString, String requestName, String action)
        throws IOException {
     connection.setConnectTimeout(HTTP_CONNECT_TIMEOUT_MS);
     connection.setReadTimeout(HTTP_READ_TIMEOUT_MS);
     connection.setRequestProperty("Content-type", CONTENT_TYPE);
     connection.setRequestProperty(
        "Content-Length", Integer.toString(Utf8.encodedLength(requestString)));
     connection.setRequestMethod(action);
     connection.setDoOutput(true);
     connection.connect();
     try (OutputStream postStream = connection.getOutputStream()) {
        postStream.write(requestString.getBytes(UTF_8));
     }
    
     int responseCode = connection.getResponseCode();
     String response = connection.getResponseMessage();
     if (responseCode != HttpURLConnection.HTTP_OK) {
        throw new IOException(
           String.format(
              "Failed to complete request.\nResponse code:%s\nError Detail:\n%s",
              responseCode, response));
     }
    }

    iOS

    Swift 中的示例代码

    // This example shows how to send an HTTP request to the backend server
    // attached with the reCAPTCHA token in the header.
    // @param serverUrl: the URL of the backend server.
    // @param rceToken: reCAPTCHA token that is attached to the header of
    // the HTTP request.
    
     public static func accessWafServer(rceToken: String, serverUrl: String)
        async throws -> String
     {
        let requestURL = try HttpHelper.createRequestURL(endpoint: serverUrl)
        var request = try HttpHelper.createRequest(requestURL: requestURL, action: "GET")
        request.setValue(rceToken, forHTTPHeaderField: "X-Recaptcha-Token")
    
        let data = try await HttpHelper.getDataFromServer(request)
    
        return String(decoding: data, as: UTF8.self)
     }

配置 Google Cloud Armor 安全政策

实现 reCAPTCHA for WAF 的功能后,您必须配置用于评估 reCAPTCHA 令牌以进行聊天机器人管理的 Google Cloud Armor 安全政策。

如需了解如何配置 Google Cloud Armor 安全政策以及如何使用 操作令牌密钥,请参阅 配置聊天机器人管理规则

后续步骤