

**推出 的新主控台體驗 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 需要您對受保護端點的請求，以包含名為 的 Cookie `aws-waf-token`與目前字符的值。

`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`包裝函式，除了從 `aws-waf-token` Cookie 讀取權杖之外，您還可以使用自訂 `x-aws-waf-token` header. AWS WAF reads 權杖來處理。下列程式碼顯示設定 標頭的範例。

```
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-samples/aws-waf-bot-control-api-protection-with-captcha](https://github.com/aws-samples/aws-waf-bot-control-api-protection-with-captcha)。