

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

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

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

# 如何使用集成 `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