

**引入全新的主机体验 AWS WAF**

现在，您可以使用更新的体验访问控制台中任意位置的 AWS WAF 功能。有关更多详细信息，请参阅[使用控制台](https://docs.aws.amazon.com/waf/latest/developerguide/working-with-console.html)。

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# AWS WAF JavaScript 集成
<a name="waf-javascript-api"></a>

本节介绍如何使用集 AWS WAF JavaScript 成。

您可以使用该 JavaScript 集成 APIs 在浏览器和其他执行设备中实现 AWS WAF 应用程序集成。 JavaScript

只有当浏览器访问 HTTPS 端点时，才能运行验证码拼图和静默质询。浏览器客户端必须在安全环境中运行才能获取令牌。
+ 智能威胁 APIs 允许您通过静默的客户端浏览器挑战来管理令牌授权，并在发送到受保护资源的请求中包含令牌。
+ CAPTCHA 集成 API 增加了智能威胁 APIs，允许您自定义验证码拼图在客户端应用程序中的位置和特征。在最终用户成功完成验证码拼图后，此 API 利用智能威胁获取 AWS WAF 令牌 APIs 以在页面中使用。

通过使用这些集成，可以确保客户端的远程过程调用包含有效的令牌。在应用程序页面上进行 APIs 这些集成后，您可以在保护包 (Web ACL) 中实施缓解规则，例如阻止不包含有效令牌的请求。您还可以通过在规则中使用 Challenge 或 CAPTCHA 操作来实施强制使用客户端应用程序获取的令牌的规则。

**智能威胁的实施示例 APIs**  
以下列表显示了 Web 应用程序页面 APIs 中智能威胁的典型实现的基本组件。

```
<head>
<script type="text/javascript" src="protection pack (web ACL) integration URL/challenge.js" defer></script>
</head>
<script>
const login_response = await AwsWafIntegration.fetch(login_url, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: login_body
  });
</script>
```

**验证码 AP JavaScript I 的实现示例**  
验证码集成 API 可让您自定义最终用户的验证码拼图体验。CAPTCHA 集成利用 JavaScript 智能威胁集成进行浏览器验证和令牌管理，并添加了配置和呈现 CAPTCHA 拼图的功能。

以下列表显示了 Web 应用程序页面中典型的 CAPTCHA JavaScript API 实现的基本组件。

```
<head>
    <script type="text/javascript" src="<Integration URL>/jsapi.js" defer></script>
</head>

<script type="text/javascript">
    function showMyCaptcha() {
        var container = document.querySelector("#my-captcha-container");
        
        AwsWafCaptcha.renderCaptcha(container, {
            apiKey: "...API key goes here...",
            onSuccess: captchaExampleSuccessFunction,
            onError: captchaExampleErrorFunction,
            ...other configuration parameters as needed...
        });
    }
    
    function captchaExampleSuccessFunction(wafToken) {
        // Use WAF token to access protected resources
        AwsWafIntegration.fetch("...WAF-protected URL...", {
            method: "POST",
            ...
        });
    }
    
    function captchaExampleErrorFunction(error) {
        /* Do something with the error */
    }
</script>

<div id="my-captcha-container">
    <!-- The contents of this container will be replaced by the captcha widget -->
</div>
```

**Topics**
+ [提供用于令牌的域名](waf-js-challenge-api-set-token-domain.md)
+ [将 JavaScript API 与内容安全策略配合使用](waf-javascript-api-csp.md)
+ [使用智能威胁 JavaScript API](waf-js-challenge-api.md)
+ [使用验证码 API JavaScript](waf-js-captcha-api.md)

# 提供用于令牌的域名
<a name="waf-js-challenge-api-set-token-domain"></a>

本节介绍了如何为令牌提供其他域。

默认情况下，在 AWS WAF 创建令牌时，它使用与保护包关联的资源的主机域 (Web ACL)。您可以为为 AWS WAF 创建的令牌提供其他域名 JavaScript APIs。为此，请使用一个或多个令牌域配置全局变量 `window.awsWafCookieDomainList`。

 AWS WAF 创建令牌时，它会使用与保护包 (Web ACL) 关联的资源的域`window.awsWafCookieDomainList`和主机域组合中最合适、最短的域。

设置示例：

```
window.awsWafCookieDomainList = ['.aws.amazon.com']
```

```
window.awsWafCookieDomainList = ['.aws.amazon.com', 'abc.aws.amazon.com']
```

您不能在此列表中使用公共后缀。例如，您不能在列表中使用 `gov.au` 或 `co.uk` 作为令牌域。

您在此列表中指定的域名必须与您的其他域名和域名配置兼容：
+ 根据受保护的主机域和 AWS WAF 为保护包配置的令牌域列表（Web ACL），这些域必须是可以接受的域。有关更多信息，请参阅 [AWS WAF 保护包 (Web ACL) 令牌域列表配置](waf-tokens-domains.md#waf-tokens-domain-lists)。
+ 如果您使用 CAP JavaScript TCHA API，则您的 CAPTCHA API 密钥中至少有一个域名必须与中的一个令牌域名完全匹配，`window.awsWafCookieDomainList`或者该域名必须是其中一个令牌域的顶点域。

  例如，对于令牌域 `mySubdomain.myApex.com`，API 密钥 `mySubdomain.myApex.com` 完全匹配，API 密钥 `myApex.com` 是顶点域。任一密钥都与令牌域相匹配。

  有关 API 密钥的更多信息，请参阅 [管理 JS CAPTCHA API 的 API 密钥](waf-js-captcha-api-key.md)。

如果您使用 `AWSManagedRulesACFPRuleSet` 托管规则组，则可以配置一个与您在规则组配置中提供的账户创建路径中的域名相匹配的域。有关此配置的更多信息，请参阅[将 ACFP 托管规则组添加到您的 web ACL](waf-acfp-rg-using.md)。

如果您使用 `AWSManagedRulesATPRuleSet` 托管规则组，则可以配置一个与您在规则组配置中提供的登录路径中的域名相匹配的域。有关此配置的更多信息，请参阅[将 ATP 托管规则组添加到您的保护包（web ACL）](waf-atp-rg-using.md)。

# 将 JavaScript API 与内容安全策略配合使用
<a name="waf-javascript-api-csp"></a>

本节提供了将 AWS WAF apex 域列入许可名单的配置示例。

如果您将内容安全策略 (CSP) 应用于您的资源，则需要将 AWS WAF apex 域列入许可名单，才能使您的 JavaScript实施发挥作用。`awswaf.com`它们 JavaScript SDKs 会调用不同的 AWS WAF 端点，因此将此域列入许可名单可提供操作 SDKs 所需的权限。

以下显示了将 AWS WAF apex 域列入许可名单的配置示例：

```
connect-src 'self' https://*.awswaf.com;
script-src 'self' https://*.awswaf.com;
script-src-elem 'self' https://*.awswaf.com;
```

如果您尝试与使用 CSP 的资源 JavaScript SDKs 一起使用，但您尚未将该 AWS WAF 域列入许可名单，则会收到如下错误：

```
Refused to load the script ...awswaf.com/<> because it violates the following Content Security Policy directive: “script-src ‘self’
```

# 使用智能威胁 JavaScript API
<a name="waf-js-challenge-api"></a>

本节提供在客户端应用程序中使用智能威胁 JavaScript API 的说明。

智能威胁 APIs 提供了针对用户的浏览器运行静默挑战的操作，以及处理提供成功挑战和验证码响应证明的 AWS WAF 令牌的操作。

首先在测试环境中实施 JavaScript 集成，然后在生产环境中实现集成。有关其他编码指导，请参阅以下各节。

 

**使用智能威胁 APIs**

1. **安装 APIs** 

   如果您使用验证码 API，可以跳过此步骤。当你安装 CAPTCHA API 时，脚本会自动安装智能威胁。 APIs

   1. 登录 AWS 管理控制台 并在 [https://console.aws.amazon.com/wafv2/homev](https://console.aws.amazon.com/wafv2/homev2) 2 上打开主 AWS WAF 机。

   1. 在导航窗格中，选择 **应用程序集成**。在**应用程序集成**页面上，您可以看到选项卡式选项。

   1. 选择**智能威胁集成**

   1. 在该选项卡中，选择要与之集成的保护包（web ACL）。保护包 (Web ACL) 列表仅包括使用`AWSManagedRulesACFPRuleSet`托管规则组、托管规则组或`AWSManagedRulesATPRuleSet`托管规则组的目标保护级别的保护包 (Web ACLs)。`AWSManagedRulesBotControlRuleSet`

   1. 打开 S **JavaScript DK** 窗格，复制脚本标签以便在集成中使用。

   1. 在应用程序页面代码的 `<head>` 部分中，插入您为保护包（web ACL）复制的脚本标记。此包含会使您的客户端应用程序在页面加载时自动在后台检索令牌。

      ```
      <head>
          <script type="text/javascript" src="protection pack (web ACL) integration URL/challenge.js” defer></script>
      <head>
      ```

      此 `<script>` 列表使用 `defer` 属性进行配置，但如果您想让页面有不同的行为，则可以将设置更改为 `async`。

1. **（可选）为客户端的令牌添加域配置**-默认情况下，在 AWS WAF 创建令牌时，它使用与保护包（Web ACL）关联的资源的主机域。要为提供其他域 JavaScript APIs，请按照中的指南进行操作[提供用于令牌的域名](waf-js-challenge-api-set-token-domain.md)。

1. **对智能威胁集成进行编码**：编写代码以确保在客户端向受保护的端点发送请求之前完成令牌检索。如果您已经在使用 `fetch` API 进行调用，则可以替换 AWS WAF 集成 `fetch` 封装器。如果您不使用 `fetch` API，则可以改用 AWS WAF 集成`getToken`操作。有关编码指导，请参阅以下部分。

1. **在保护包（web ACL）中添加令牌验证**：在保护包（web ACL）中添加至少一条规则，用于检查客户端发送的 web 请求中是否存在有效的质询令牌。您可以使用规则组来检查和监控质询令牌，例如机器人控制功能托管规则组的目标级别，也可以使用 Challenge 规则操作进行检查，如 [CAPTCHA然后Challenge在 AWS WAF](waf-captcha-and-challenge.md) 中所述。

   新增的保护包（web ACL）可验证对受保护端点的请求是否包含您在客户端集成中获取的令牌。包含有效、未过期令牌的请求将通过 Challenge 检查，并且不会向您的客户发送另一个静默质询。

1. **（可选）阻止缺少令牌的请求** — 如果您将 APIs 与 ACFP 托管规则组、ATP 托管规则组或 Bot Control 规则组的目标规则一起使用，则这些规则不会阻止缺少令牌的请求。要阻止缺少令牌的请求，请按照 [阻止没有有效 AWS WAF 令牌的请求](waf-tokens-block-missing-tokens.md) 中的指导进行操作。

**Topics**
+ [智能威胁 API 规范](waf-js-challenge-api-specification.md)
+ [如何使用集成 `fetch` 包装程序](waf-js-challenge-api-fetch-wrapper.md)
+ [如何使用集成 `getToken`](waf-js-challenge-api-get-token.md)

# 智能威胁 API 规范
<a name="waf-js-challenge-api-specification"></a>

本节列出了智能威胁缓解的方法和属性的规范 JavaScript APIs。使用它们 APIs 进行智能威胁和验证码集成。

**`AwsWafIntegration.fetch()`**  
使用 AWS WAF 集成实现向服务器发送 HTTP `fetch` 请求。

**`AwsWafIntegration.getToken()`**  
检索存储的 AWS WAF 令牌并将其存储在当前页面上的 Cookie 中`aws-waf-token`，名称和值设置为令牌值。

**`AwsWafIntegration.hasToken()`**  
返回一个布尔值，指示 `aws-waf-token` Cookie 当前是否包含未过期的令牌。

如果您也在使用验证码集成，请参阅相关规范，网址为 [验证码 API 规范 JavaScript](waf-js-captcha-api-specification.md)。

# 如何使用集成 `fetch` 包装程序
<a name="waf-js-challenge-api-fetch-wrapper"></a>

本节提供了使用集成 `fetch` 包装程序的说明。

你可以通过更改`AwsWafIntegration`命名空间下对 `fetch` API 的常规`fetch`调用来使用 AWS WAF `fetch`包装器。 AWS WAF 包装器支持所有与标准 JavaScript `fetch` API 调用相同的选项，并为集成添加了令牌处理。这种方法通常是集成应用程序的最简单方法。

**在包装程序实施之前**  
以下示例列表显示了实施 `AwsWafIntegration` `fetch` 包装程序之前的标准代码。

```
const login_response = await fetch(login_url, {
	    method: 'POST',
	    headers: {
	      'Content-Type': 'application/json'
	    },
	    body: login_body
	  });
```

**包装程序实施后**  
以下列表显示了与 `AwsWafIntegration` `fetch` 包装程序实施相同的代码。

```
const login_response = await AwsWafIntegration.fetch(login_url, {
	    method: 'POST',
	    headers: {
	      'Content-Type': 'application/json'
	    },
	    body: login_body
	  });
```

# 如何使用集成 `getToken`
<a name="waf-js-challenge-api-get-token"></a>

本部分介绍了如何使用 `getToken` 操作。

AWS WAF 要求您向受保护端点发出的请求中包含以当前令牌值命名`aws-waf-token`的 Cookie。

该 `getToken` 操作是一个异步 API 调用，用于检索 AWS WAF 令牌并将其存储在名为 `aws-waf-token` 的当前页面的 Cookie 中，值设置为令牌值。您可以根据需要在页面中使用此令牌 Cookie。

当您调用 `getToken`，它会执行以下操作：
+ 如果未过期的令牌已经可用，则调用会立即将其返回。
+ 否则，该调用将从令牌提供程序那里检索新令牌，等待最多 2 秒钟才能完成令牌获取工作流程，然后超时。如果操作超时，则会引发错误，您的调用代码必须处理该错误。

该 `getToken` 操作有一个附带的 `hasToken` 操作，用于指示 `aws-waf-token` Cookie 当前是否包含未过期的令牌。

`AwsWafIntegration.getToken()` 检索有效令牌并将其存储为 Cookie。大多数客户端调用会自动附加此 Cookie，但有些客户端不会。例如，跨主机域发出的调用不会附加 Cookie。在接下来的实现细节中，我们将展示如何使用这两种类型的客户端调用。

**基本 `getToken` 实现，适用于附加 `aws-waf-token` Cookie 的调用**  
以下示例列表显示了通过登录请求实施 `getToken` 操作的标准代码。

```
const login_response = await AwsWafIntegration.getToken()
	    .catch(e => {
	        // Implement error handling logic for your use case
	    })
	    // The getToken call returns the token, and doesn't typically require special handling
	    .then(token => {
	        return loginToMyPage()
	    })
	
	async function loginToMyPage() {
	    // Your existing login code
	}
```

**只有在 `getToken` 提供令牌后才能提交表格**  
以下列表显示了如何注册事件侦听器以拦截表单提交，直到有有效的令牌可供使用。

```
<body>
	  <h1>Login</h1>
	  <p></p>
	  <form id="login-form" action="/web/login" method="POST" enctype="application/x-www-form-urlencoded">
	    <label for="input_username">USERNAME</label>
	    <input type="text" name="input_username" id="input_username"><br>
	    <label for="input_password">PASSWORD</label>
	    <input type="password" name="input_password" id="input_password"><br>
	    <button type="submit">Submit<button>
	  </form>
	
	<script>
	  const form = document.querySelector("#login-form");
	
	  // Register an event listener to intercept form submissions
	  form.addEventListener("submit", (e) => {
	      // Submit the form only after a token is available 
	      if (!AwsWafIntegration.hasToken()) {
	          e.preventDefault();
	          AwsWafIntegration.getToken().then(() => {
	              e.target.submit();
	          }, (reason) => { console.log("Error:"+reason) });
	        }
	    });
	</script>
	</body>
```

**当客户端默认不附加 `aws-waf-token` Cookie 时附加令牌**  
`AwsWafIntegration.getToken()` 检索有效令牌并将其存储为 Cookie，但并非所有客户端调用都默认附加此 Cookie。例如，跨主机域发出的调用不会附加 Cookie。

`fetch`包装器会自动处理这些情况，但是如果您无法使用`fetch`包装器，则可以使用自定义`x-aws-waf-token`标题来处理此问题。 AWS WAF 除了从 `aws-waf-token` Cookie 中读取令牌外，还会从该标头中读取令牌。以下代码显示了设置标头的示例：

```
const token = await AwsWafIntegration.getToken();
const result = await fetch('/url', {
    headers: {
        'x-aws-waf-token': token,
    },
});
```

默认情况下， AWS WAF 仅接受包含与请求的主机域相同域名的令牌。任何跨域令牌都需要在保护包（web ACL）令牌域列表中有相应条目。有关更多信息，请参阅 [AWS WAF 保护包 (Web ACL) 令牌域列表配置](waf-tokens-domains.md#waf-tokens-domain-lists)。

有关跨域令牌使用的更多信息，请参阅 [aws-s aws-waf-bot-control](https://github.com/aws-samples/aws-waf-bot-control-api-protection-with-captcha) amples/-。api-protection-with-captcha

# 使用验证码 API JavaScript
<a name="waf-js-captcha-api"></a>

本节提供了使用 CAPTCHA 集成 API 的说明。

CAPTCHA JavaScript API 允许您配置验证码拼图并将其放置在客户端应用程序中所需的位置。在最终用户成功完成验证码拼图后 JavaScript APIs ，此 API 利用智能威胁的功能来获取和使用 AWS WAF 代币。

首先在测试环境中实施 JavaScript 集成，然后在生产环境中实现集成。有关其他编码指导，请参阅以下各节。

**使用验证码集成 API**

1. **安装 API**

   1. 登录 AWS 管理控制台 并在 [https://console.aws.amazon.com/wafv2/homev](https://console.aws.amazon.com/wafv2/homev2) 2 上打开主 AWS WAF 机。

   1. 在导航窗格中，选择 **应用程序集成**。在**应用程序集成**页面上，您可以看到选项卡式选项。

   1. 选择**验证码集成**。

   1. 复制列出的 JavaScript 集成脚本标签，以便在集成中使用。

   1. 在应用程序页面代码的 `<head>` 部分中，插入您复制的脚本标签。此功能使验证码拼图可供配置和使用。

      ```
      <head>
          <script type="text/javascript" src="integrationURL/jsapi.js" defer></script>
      </head>
      ```

      此 `<script>` 列表使用 `defer` 属性进行配置，但如果您想让页面有不同的行为，则可以将设置更改为 `async`。

      如果智能威胁集成脚本尚不存在，验证码脚本还会自动加载该脚本。智能威胁集成脚本使您的客户端应用程序在页面加载时自动在后台检索令牌，并提供您使用验证码 API 所需的其他令牌管理功能。

1. **（可选）为客户端的令牌添加域配置**-默认情况下，在 AWS WAF 创建令牌时，它使用与保护包（Web ACL）关联的资源的主机域。要为提供其他域 JavaScript APIs，请按照中的指南进行操作[提供用于令牌的域名](waf-js-challenge-api-set-token-domain.md)。

1. **获取客户端的加密 API 密钥** — CAPTCHA API 需要一个包含有效客户端域列表的加密 API 密钥。 AWS WAF 使用此密钥来验证您在集成中使用的客户端域是否已获准使用 AWS WAF CAPTCHA。要生成 API 密钥，请按照 [管理 JS CAPTCHA API 的 API 密钥](waf-js-captcha-api-key.md) 中的指导进行操作。

1. **编写验证码控件实施代码**：在页面中要使用它的位置实施 `renderCaptcha()` API 调用。有关配置和使用此功能的信息，请参阅以下各节 [验证码 API 规范 JavaScript](waf-js-captcha-api-specification.md) 和 [如何显示验证码拼图](waf-js-captcha-api-render.md)。

   CAPTCHA 实现与智能威胁集成集成， APIs 用于令牌管理和运行使用令牌的提取调用。 AWS WAF 有关使用它们的指导 APIs，请参阅[使用智能威胁 JavaScript API](waf-js-challenge-api.md)。

1. **在保护包（web ACL）中添加令牌验证**：在保护包（web ACL）中添加至少一条规则，用于检查客户端发送的 web 请求中是否存在有效的验证码令牌。您可以使用 CAPTCHA 规则操作进行检查，如 [CAPTCHA然后Challenge在 AWS WAF](waf-captcha-and-challenge.md) 中所述。

   新增的保护包（web ACL）可验证发往受保护端点的请求是否包含您在客户端集成中获取的令牌。包含有效、未过期的验证码令牌的请求会通过 CAPTCHA 规则操作检查，并且不会向您的最终用户显示其他验证码拼图。

实现 JavaScript API 后，您可以查看验证码拼图尝试次数和解决方案的 CloudWatch 指标。有关指标和维度的详细信息，请参阅 [账户指标和维度](waf-metrics.md#waf-metrics-account)。

**Topics**
+ [验证码 API 规范 JavaScript](waf-js-captcha-api-specification.md)
+ [如何显示验证码拼图](waf-js-captcha-api-render.md)
+ [处理来自的验证码响应 AWS WAF](waf-js-captcha-api-conditional.md)
+ [管理 JS CAPTCHA API 的 API 密钥](waf-js-captcha-api-key.md)

# 验证码 API 规范 JavaScript
<a name="waf-js-captcha-api-specification"></a>

本节列出了验证码的方法和属 JavaScript APIs性的规范。使用验证码在您的客户端 JavaScript APIs 应用程序中运行自定义的验证码拼图。

此 API 建立在智能威胁的基础上 APIs，您可以使用智能威胁来配置和管理 AWS WAF 令牌的获取和使用。请参阅 [智能威胁 API 规范](waf-js-challenge-api-specification.md)。

**`AwsWafCaptcha.renderCaptcha(container, configuration)`**  
向最终用户展示 AWS WAF 验证码拼图，成功后，使用验证码验证更新客户端令牌。这仅在集成了验证码时可用。使用此调用和智能威胁 APIs 来管理令牌检索并在您的`fetch`通话中提供令牌。请访问以下网址查看智能威胁APIs [智能威胁 API 规范](waf-js-challenge-api-specification.md)。  
与 AWS WAF 发送的 CAPTCHA 插页式广告不同，通过这种方法渲染的 CAPTCHA 拼图会立即显示拼图，而无需初始标题屏幕。    
**`container`**  
页面上目标容器元素的 `Element` 对象。这通常是通过调用 `document.getElementById()` 或 `document.querySelector()` 来检索的。  
是否必需：是  
类型：`Element`  
**配置**  
一个包含验证码配置设置的对象，如下所示 ****：    
**`apiKey`**   
启用客户端域权限的加密 API 密钥。使用 AWS WAF 控制台为您的客户端域生成 API 密钥。一个密钥最多可用于五个域。有关信息，请参阅[管理 JS CAPTCHA API 的 API 密钥](waf-js-captcha-api-key.md)。  
是否必需：是  
类型：`string`  
**`onSuccess: (wafToken: string) => void;`**   
当最终用户成功完成验证码拼图时，使用有效 AWS WAF 令牌调用。在发送到使用保护包（Web ACL）保护的端点的 AWS WAF 请求中使用令牌。该令牌提供了最近成功完成拼图的证明和时间戳。  
是否必需：是  
**`onError?: (error: CaptchaError) => void;`**   
在验证码操作期间发生错误时，使用错误对象调用。  
必需：否  
**`CaptchaError` 类定义**：`onError` 处理程序使用以下类定义提供错误类型。  

```
CaptchaError extends Error {
    kind: "internal_error" | "network_error" | "token_error" | "client_error";
    statusCode?: number;
}
```
+ `kind`：返回的错误类型。
+ `statusCode`：HTTP 状态码（如果有）。如果错误是由于 HTTP 错误造成的，则 `network_error` 将使用此选项。  
**`onLoad?: () => void;`**   
在加载新的验证码拼图时调用。  
必需：否  
**`onPuzzleTimeout?: () => void;`**   
在验证码拼图过期前未完成时调用。  
必需：否  
**`onPuzzleCorrect?: () => void;`**   
当有人为验证码拼图提供正确答案时调用。  
必需：否  
**`onPuzzleIncorrect?: () => void;`**   
当有人为验证码拼图提供不正确答案时调用。  
必需：否  
**`defaultLocale`**   
用于验证码拼图的默认语言环境。验证码拼图的书面说明有阿拉伯语 (ar-SA)、简体中文 (zh-CN)、荷兰语 (nl-NL)、英语 (en-US)、法语 (fr-FR)、德语 (de-DE)、意大利语 (it-IT)、日语 (ja-JP)、巴西葡萄牙语 (pt-BR)、西班牙语 (es-ES) 和土耳其语 (tr-TR)。除了中文和日语（默认为英语）外，所有书面语言都支持音频指令。要更改默认语言，请提供国际语言和区域代码，例如 `ar-SA`。  
默认：最终用户浏览器中当前使用的语言  
必需：否  
类型：`string`  
**`disableLanguageSelector`**   
如果设置为 `true`，则验证码拼图会隐藏语言选择器。  
默认值：`false`  
必需：否  
类型：`boolean`  
**`dynamicWidth`**   
如果设置为 `true`，则验证码拼图会更改宽度以与浏览器窗口宽度兼容。  
默认值：`false`  
必需：否  
类型：`boolean`  
**`skipTitle`**   
如果设置为 `true`，则验证码拼图不会显示拼图标题**完成拼图**。  
默认值：`false`  
必需：否  
类型：`boolean`

# 如何显示验证码拼图
<a name="waf-js-captcha-api-render"></a>

本节提供了 `renderCaptcha` 实现的一个示例。

你可以在客户端界面中随心所欲地使用该 AWS WAF `renderCaptcha`呼叫。该呼叫从中检索验证码拼图 AWS WAF，对其进行渲染，然后将结果发送到进行验证。 AWS WAF 调用时，您需要提供拼图显示配置以及最终用户完成拼图时要运行的回调。有关选项的更多信息，请参阅上一部分 [验证码 API 规范 JavaScript](waf-js-captcha-api-specification.md)。

将此调用与智能威胁集成的令牌管理功能结合使用 APIs。该调用将为您的客户端提供一个令牌，用于验证验证码拼图是否成功完成。使用智能威胁集成 APIs 来管理令牌，并在客户端对受 AWS WAF 保护包 (Web ACLs) 保护的端点的调用中提供令牌。有关智能威胁的信息 APIs，请参阅[使用智能威胁 JavaScript API](waf-js-challenge-api.md)。

**实施示例**  
以下示例列表显示了标准的 CAPTCHA 实现，包括 AWS WAF 集成 URL 在该部分中的`<head>`位置。

此列表使用成功回调配置该`renderCaptcha`函数，该回调使用智能威胁集成的`AwsWafIntegration.fetch`封装器。 APIs有关此函数的信息，请参阅 [如何使用集成 `fetch` 包装程序](waf-js-challenge-api-fetch-wrapper.md)。

```
<head>
    <script type="text/javascript" src="<Integration URL>/jsapi.js" defer></script>
</head>

<script type="text/javascript">
    function showMyCaptcha() {
        var container = document.querySelector("#my-captcha-container");
        
        AwsWafCaptcha.renderCaptcha(container, {
            apiKey: "...API key goes here...",
            onSuccess: captchaExampleSuccessFunction,
            onError: captchaExampleErrorFunction,
            ...other configuration parameters as needed...
        });
    }
    
    function captchaExampleSuccessFunction(wafToken) {
        // Captcha completed. wafToken contains a valid WAF token. Store it for
        // use later or call AwsWafIntegration.fetch() to use it easily.
        // It will expire after a time, so calling AwsWafIntegration.getToken()
        // again is advised if the token is needed later on, outside of using the
        // fetch wrapper.
        
        // Use WAF token to access protected resources
        AwsWafIntegration.fetch("...WAF-protected URL...", {
            method: "POST",
            headers: {
                "Content-Type": "application/json",
            },
            body: "{ ... }" /* body content */
        });
    }
    
    function captchaExampleErrorFunction(error) {
        /* Do something with the error */
    }
</script>

<div id="my-captcha-container">
    <!-- The contents of this container will be replaced by the captcha widget -->
</div>
```

**配置设置示例**  
以下示例列表显示了宽度和标题选项的非默认设置 `renderCaptcha`。

```
        AwsWafCaptcha.renderCaptcha(container, {
            apiKey: "...API key goes here...",
            onSuccess: captchaExampleSuccessFunction,
            onError: captchaExampleErrorFunction,
            dynamicWidth: true, 
            skipTitle: true
        });
```

有关配置选项的全部信息，请参阅 [验证码 API 规范 JavaScript](waf-js-captcha-api-specification.md)。

# 处理来自的验证码响应 AWS WAF
<a name="waf-js-captcha-api-conditional"></a>

本节提供了处理验证码响应的示例。

如果匹配的 Web 请求没有带有有效 CAPTCHA 时间戳的令牌，则带有CAPTCHA操作的 AWS WAF 规则将终止对该请求的评估。如果请求是`GET` text/html 通话，则该CAPTCHA操作会向客户提供带有验证码拼图的插页式广告。当你不集成 CAPTCHA JavaScript API 时，插页式广告会运行拼图，如果最终用户成功解决了这个问题，则会自动重新提交请求。

当你集成 CAPTCHA JavaScript API 并自定义验证码处理时，你需要检测终止的验证码响应，提供你的自定义 CAPTCHA，然后如果最终用户成功解决了难题，则重新提交客户的 Web 请求。

以下代码示例演示如何执行此操作。

**注意**  
 AWS WAF CAPTCHA操作响应的状态码为 HTTP 405，我们用它来识别此代码中的CAPTCHA响应。如果您的受保护端点使用 HTTP 405 状态代码为同一调用传递任何其他类型的响应，本示例代码也会为这些响应显示验证码拼图。

```
<!DOCTYPE html>
<html>
<head>
    <script type="text/javascript" src="<Integration URL>/jsapi.js" defer></script>
</head>
<body>
    <div id="my-captcha-box"></div>
    <div id="my-output-box"></div>

    <script type="text/javascript">
    async function loadData() {
        // Attempt to fetch a resource that's configured to trigger a CAPTCHA
        // action if the rule matches. The CAPTCHA response has status=HTTP 405.
        const result = await AwsWafIntegration.fetch("/protected-resource");

        // If the action was CAPTCHA, render the CAPTCHA and return

        // NOTE: If the endpoint you're calling in the fetch call responds with HTTP 405
        // as an expected response status code, then this check won't be able to tell the
        // difference between that and the CAPTCHA rule action response.

        if (result.status === 405) {
            const container = document.querySelector("#my-captcha-box");
            AwsWafCaptcha.renderCaptcha(container, {
                apiKey: "...API key goes here...",
                onSuccess() {
                    // Try loading again, now that there is a valid CAPTCHA token
                    loadData();
                },
            });
            return;
        }

        const container = document.querySelector("#my-output-box");
        const response = await result.text();
        container.innerHTML = response;
    }

    window.addEventListener("load", () => {
        loadData();
    });
    </script>
</body>
</html>
```

# 管理 JS CAPTCHA API 的 API 密钥
<a name="waf-js-captcha-api-key"></a>

本节提供了生成和删除 API 密钥的说明。

要将 AWS WAF 验证码集成到带有 JavaScript API 的客户端应用程序中，您需要用于运行验证码拼图的客户端域的 API 集成标签和加密 API 密钥。 JavaScript 

的 CAPTCHA 应用程序集成 JavaScript 使用加密的 API 密钥来验证客户端应用程序域是否有权使用 AWS WAF CAPTCHA API。当您从 JavaScript 客户端调用 CAPTCHA API 时，您需要提供一个 API 密钥和一个包含当前客户端域名的域名列表。一个加密密钥最多可列出 5 个域。

**API 密钥要求**  
您在验证码集成中使用的 API 密钥必须包含一个适用于您使用密钥的客户端的域。
+ 如果您在客户的智能威胁集成中指定了 `window.awsWafCookieDomainList`，那么您的 API 密钥中至少有一个域必须与 `window.awsWafCookieDomainList` 中的一个令牌域完全匹配，或者必须是其中一个令牌域的顶点域。

  例如，对于令牌域 `mySubdomain.myApex.com`，API 密钥 `mySubdomain.myApex.com` 完全匹配，API 密钥 `myApex.com` 是顶点域。任一密钥都与令牌域相匹配。

  有关设置令牌域列表的信息，请参阅 [提供用于令牌的域名](waf-js-challenge-api-set-token-domain.md)。
+ 否则，当前域名必须包含在 API 密钥中。当前域名是您可以在浏览器地址栏中看到的域名。

根据受保护的主机域和为 Web ACL 配置的令牌域列表，您使用的域必须是可以接受的域。 AWS WAF 有关更多信息，请参阅 [AWS WAF 保护包 (Web ACL) 令牌域列表配置](waf-tokens-domains.md#waf-tokens-domain-lists)。

**如何为 API 密钥选择区域**  
AWS WAF 可以在任何可用的区域生成 CAPTCHA API 密钥。 AWS WAF 

通常，您应为 CAPTCHA API 密钥使用与保护包（web ACL）相同的区域。但是，如果您希望全球受众使用区域保护包（Web ACL），则可以获取范围为的验证码 JavaScript 集成标签 CloudFront 和范围为的API密钥，然后将其与区域保护包（Web ACL）一起使用。 CloudFront这种方法允许客户端从距其最近的区域加载验证码拼图，从而减小延迟。

CAPTCHA API 密钥的作用域仅限于其他区域 CloudFront ，不支持跨多个区域使用。它们只能在适用范围内的区域中使用。

**为您的客户端域生成 API 密钥**  
通过控制台获取集成 URL 并生成和检索 API 密钥。

1. 登录 AWS 管理控制台 并在 [https://console.aws.amazon.com/wafv2/homev](https://console.aws.amazon.com/wafv2/homev2) 2 上打开主 AWS WAF 机。

1. 在导航窗格中，选择 **应用程序集成**。

1. 在**为应用程序集成启用的保护包 (Web ACLs)** 窗格中，选择要用于 API 密钥的区域。您还可以在 **CAPTCHA 集成**选项卡的 **API 密钥**窗格中选择区域。

1. 选择**验证码集成**选项卡。此选项卡提供可在 JavaScript 集成中使用的 CAPTCHA 集成标签以及 API 密钥列表。两者的范围均限于所选区域。

1. 在 **API 密钥**窗格中，选择**生成密钥**。此时将显示生成密钥对话框。

1. 输入要包含在密钥中的客户端域。您最多可以输入 5 个。完成后，选择**生成密钥**。界面返回到验证码集成选项卡，其中列出了您的新密钥。

   API 密钥一经创建，即不可变。如果您需要更改密钥，请生成一个新密钥并改用该密钥。

1. （可选）复制新生成的密钥以用于集成。

您也可以使用 REST APIs 或特定语言之一来完成这项 AWS SDKs 工作。REST API 调用是 “[创建” APIKey 和 “](https://docs.aws.amazon.com/waf/latest/APIReference/API_CreateAPIKey.html)[列出” APIKeys](https://docs.aws.amazon.com/waf/latest/APIReference/API_ListAPIKeys.html)。

**删除 API 密钥**  
要删除 API 密钥，必须使用 REST API 或特定语言之一 AWS SDKs。REST API 调用为[删除APIKey](https://docs.aws.amazon.com/waf/latest/APIReference/API_DeleteAPIKey.html)。您不能使用控制台删除键。

删除密钥后，最长可能需要 24 小时 AWS WAF 才能禁止在所有地区使用该密钥。