

**の新しいコンソールエクスペリエンスの紹介 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 を使用して、JavaScript を実行するブラウザやその他のデバイスに AWS WAF アプリケーション統合を実装できます。

CAPTCHA パズルとサイレントチャレンジは、ブラウザが HTTPS エンドポイントにアクセスしている場合にのみ実行できます。トークンを取得するには、ブラウザクライアントが安全なコンテキストで実行されている必要があります。
+ インテリジェントな脅威に対応した API を使用すると、クライアント側のサイレントブラウザのチャレンジを通じてトークン認可を管理し、保護されたリソースに送信するリクエストにトークンを含めることができます。
+ CAPTCHA 統合 API にインテリジェントな脅威に対応した API が追加され、クライアントアプリケーションでの CAPTCHA パズルの配置と特性をカスタマイズすることができるようになりました。この API は、インテリジェントな脅威に対応した API を活用し、エンドユーザーが CAPTCHA パズルの完成に成功した後にページで使用する AWS WAF トークンを取得します。

これらの統合を使用すると、クライアントによるリモートプロシージャコールに有効なトークンが含まれていることを確認できます。これらの統合 API がアプリケーションのページで実行されている場合、有効なトークンを含まないリクエストをブロックするなどの緩和ルールを保護パック (ウェブ ACL) で実装できます。ルール内の Challenge または CAPTCHA アクションを使用して、クライアントアプリケーションが取得したトークンの使用を強制するルールを実装することもできます。

**インテリジェントな脅威 API の実施例**  
次のリストは、ウェブアプリケーションページでのインテリジェントな脅威に対応した API の一般的な実装の基本コンポーネントを示しています。

```
<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>
```

**CAPTCHA JavaScript API の実施例**  
CAPTCHA 統合 API を使用すると、エンドユーザーの CAPTCHA パズルエクスペリエンスをカスタマイズできます。CAPTCHA 統合では、ブラウザの検証とトークン管理用に JavaScript のインテリジェントな脅威に対応した統合が活用されているだけでなく、CAPTCHA パズルの設定とレンダリング用の機能も追加されています。

次のリストは、ウェブアプリケーションページでの 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)
+ [CAPTCHA JavaScript API を使用する](waf-js-captcha-api.md)

# トークンで使用するドメインの提供
<a name="waf-js-challenge-api-set-token-domain"></a>

このセクションでは、トークンに追加のドメインを提供する方法について説明します。

デフォルトでは、 がトークン AWS WAF を作成すると、保護パック (ウェブ ACL) に関連付けられているリソースのホストドメインが使用されます。 AWS WAF が JavaScript API 用に作成するトークンには、追加のドメインを指定できます。これを行うには、グローバル変数 `window.awsWafCookieDomainList` に 1 つ以上のトークンドメインを設定します。

がトークン AWS WAF を作成すると、 のドメイン`window.awsWafCookieDomainList`と、保護パック (ウェブ ACL) に関連付けられているリソースのホストドメインの組み合わせの中から、最も適切で最短のドメインが使用されます。

設定の例 

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

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

このリストではパブリックサフィックスを使用できません。例えば、`gov.au` または `co.uk` をリストでトークンドメインとして使用することはできません。

このリストで指定するドメインは、他のドメインやドメイン設定と互換性がある必要があります。
+ ドメインは、保護されたホストドメインと、保護パック (ウェブ ACL) 用に設定されたトークンドメインリストに基づいて、 が AWS WAF 受け入れるドメインである必要があります。詳細については、「[AWS WAF 保護パック (ウェブ ACL) トークンドメインリスト設定](waf-tokens-domains.md#waf-tokens-domain-lists)」を参照してください。
+ JavaScript CAPTCHA API を使用する場合、CAPTCHA API キー内の少なくとも 1 つのドメインが、`window.awsWafCookieDomainList` のトークンドメインの 1 つと完全に一致するか、いずれかのトークンドメインの apex ドメインである必要があります。

  例えば、トークンドメイン `mySubdomain.myApex.com` の場合、API キー `mySubdomain.myApex.com` は完全に一致し、API キー `myApex.com` は apex ドメインです。どちらかのキーがトークンドメインに一致します。

  API キーの詳細については、「[JS CAPTCHA API の API キーの管理](waf-js-captcha-api-key.md)」を参照してください。

`AWSManagedRulesACFPRuleSet` マネージドルールグループを使用する場合、ルールグループ設定に指定したアカウント作成パスのドメインと一致するドメインを設定できます。この設定の詳細については、「[ACFP マネージドルールグループをウェブ ACL に追加](waf-acfp-rg-using.md)」を参照してください。

`AWSManagedRulesATPRuleSet` マネージドルールグループを使用する場合、ルールグループ設定に指定したログインパスのドメインと一致するドメインを設定できます。この設定の詳細については、「[ATP マネージドルールグループを保護パック (ウェブ ACL) に追加](waf-atp-rg-using.md)」を参照してください。

# コンテンツセキュリティポリシーでの JavaScript API の使用
<a name="waf-javascript-api-csp"></a>

このセクションでは、apex AWS WAF ドメインを許可リストに登録するための設定例を示します。

コンテンツセキュリティポリシー (CSP) をリソースに適用し、JavaScript 実装を機能させるには、apex AWS WAF ドメイン を許可リストに登録する必要があります`awswaf.com`。JavaScript SDK は異なる AWS WAF エンドポイントを呼び出すため、このドメインを許可リストに登録すると、SDK の動作に必要な権限が付与されます。

以下は、apex AWS WAF ドメインを許可リストに登録するための設定例です。

```
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は、ユーザーのブラウザに対してサイレントチャレンジを実行するオペレーションと、チャレンジと CAPTCHA レスポンスが成功した証拠を提供する AWS WAF トークンを処理するオペレーションを提供します。

JavaScript 統合を最初にテスト環境で実装し、次に本番環境で実装します。追加のコーディングガイダンスについては、次のセクションを参照してください。

 

**インテリジェントな脅威に対応した API を使用するには**

1. **API のインストール** 

   CAPTCHA API を使用している場合は、このステップをスキップできます。CAPTCHA API をインストールすると、スクリプトはインテリジェントな脅威に対応した API を自動的にインストールします。

   1. にサインイン AWS マネジメントコンソール し、[https://console.aws.amazon.com/wafv2/homev2](https://console.aws.amazon.com/wafv2/homev2) で AWS WAF コンソールを開きます。

   1. ナビゲーションペインで、**[Application integration]** (アプリケーション統合) を選択します。**[アプリケーション統合]** ページに、タブ付きのオプションが表示されます。

   1. **[インテリジェントな脅威に対応した統合]** を選択

   1. タブで、統合する保護パック (ウェブ ACL) を選択します。保護パック (ウェブ ACL) リストには、`AWSManagedRulesACFPRuleSet` マネージドルールグループ、`AWSManagedRulesATPRuleSet` マネージドルールグループ、または `AWSManagedRulesBotControlRuleSet` マネージドルールグループのターゲットを絞った保護レベルを使用する保護パック (ウェブ ACL) のみが含まれます。

   1. **[JavaScript SDK]** ペインを開き、統合で使用するスクリプトタグをコピーします。

   1. `<head>` セクションのアプリケーションページコードに、保護パック (ウェブ ACL) 用にコピーしたスクリプトタグを挿入します。この包含により、クライアントアプリケーションは、ページをロードする際にバックグラウンドでトークンを自動的に取得します。

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

      この `<script>` リストは `defer` 属性で設定されていますが、ページに別の動作が必要な場合は、設定を `async` に変更できます。

1. **(オプション) クライアントのトークンにドメイン設定を追加する** – デフォルトでは、 がトークン AWS WAF を作成すると、保護パック (ウェブ ACL) に関連付けられているリソースのホストドメインが使用されます。JavaScript API に追加のドメインを指定するには、「[トークンで使用するドメインの提供](waf-js-challenge-api-set-token-domain.md)」のガイダンスに従ってください。

1. **インテリジェントな脅威に対応した統合をコーディングする** – クライアントで保護されたエンドポイントにリクエストを送信する前に、トークンの取得が完了するようにコードを記述します。既に `fetch` API を使用して呼び出しを行っている場合は、 AWS WAF 統合 `fetch` ラッパーに置き換えることができます。`fetch` API を使用しない場合は、代わりに AWS WAF 統合`getToken`オペレーションを使用できます。コーディングガイダンスについては、次のセクションを参照してください。

1. **保護パック (ウェブ ACL) にトークン検証を追加する** – クライアントで送信するウェブリクエスト内に有効なチャレンジトークンがないかチェックするルールを、保護パック (ウェブ ACL) に少なくとも 1 つ追加します。Bot Control マネージドルールグループのターゲットレベルのような、チャレンジトークンをチェックおよびモニタリングするルールグループを使用できるため、「[CAPTCHA および Challengeの AWS WAF](waf-captcha-and-challenge.md)」の説明に従い、Challenge ルールアクションを使用してチェックします。

   保護パック (ウェブ ACL) を追加すると、保護されたエンドポイントへのリクエストに、クライアント統合で取得したトークンが含まれていることを確認できます。有効で期限が切れていないトークンを含むリクエストは、Challenge 検査に合格し、クライアントに別のサイレントチャレンジを送信することはありません。

1. **(オプション) トークンが不足しているリクエストをブロックする** – ACFP マネージドルールグループ、ATP マネージドルールグループまたは Bot Control ルールグループのターゲットを絞ったルールで API を使用する場合、これらのルールはトークンが不足しているリクエストをブロックしません。トークンが不足しているリクエストをブロックするには、[有効な 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 API のメソッドとプロパティの仕様を示します。インテリジェントな脅威に対応したこれらの API と CAPTCHA 統合を使用します。

**`AwsWafIntegration.fetch()`**  
 AWS WAF 統合実装を使用して HTTP `fetch`リクエストをサーバーに送信します。

**`AwsWafIntegration.getToken()`**  
保存された AWS WAF トークンを取得し`aws-waf-token`、現在のページの という名前の Cookie に保存します。値はトークン値に設定されます。

**`AwsWafIntegration.hasToken()`**  
有効期限が切れていないトークンが現在 `aws-waf-token` cookie で保持されているかどうかを示すブール値を返します。

CAPTCHA 統合も使用している場合は、「[CAPTCHA JavaScript API 仕様](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` オペレーションとは、 AWS WAF トークンを取得し、名前を `aws-waf-token` にして、値をトークン値に設定し、現在のページの cookie に保存する非同期 API コールです。このトークン cookie は、必要に応じてページで使用できます。

`getToken` を呼び出すと、次が実行されます。
+ 期限切れでないトークンが既に使用可能な場合、コールは直ちにそれを返します。
+ それ以外の場合、コールは トークンプロバイダーから新しいトークンを取得します。トークン取得ワークフローが完了するまで最大で 2 秒間の猶予があり、この待機期間が経過するとタイムアウトします。オペレーションがタイムアウトすると、呼び出しコードが処理しなければならないエラーがスローされます。

`getToken` オペレーションには付随する `hasToken` オペレーションがあり、`aws-waf-token` cookie が現在有効期限が切れていないトークンを保持しているかどうかを示します。

`AwsWafIntegration.getToken()` は有効なトークンを取得し、それを Cookie として保存します。ほとんどのクライアント呼び出しは、この Cookie を自動的にアタッチしますが、アタッチしないクライアント呼び出しもあります。例えば、ホストドメイン間で行われた呼び出しは Cookie にアタッチしません。以下の実施詳細では、両方のタイプのクライアント呼び出しを操作する方法を示します。

**`aws-waf-token` Cookie にアタッチする呼び出しの基本的な `getToken` 実施**  
次のリストの例は、ログインリクエストで `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`ラッパーを使用できない場合は、Cookie から読み取るだけでなく、このヘッダーのカスタム `x-aws-waf-token` header. AWS WAF reads `aws-waf-token` トークンを使用して処理できます。次のコードは、ヘッダーの設定例を示しています。

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

デフォルトでは、 はリクエストされたホストドメインと同じドメインを含むトークン AWS WAF のみを受け入れます。クロスドメイントークンには、保護パック (ウェブ ACL) トークンドメインリストの対応するエントリが必要です。詳細については、「[AWS WAF 保護パック (ウェブ 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)」を参照してください。

# CAPTCHA JavaScript API を使用する
<a name="waf-js-captcha-api"></a>

このセクションでは、CAPTCHA 統合 API を使用する手順について説明します。

CAPTCHA JavaScript API を使用すると、CAPTCHA パズルを設定し、クライアントアプリケーションの任意の場所に配置できます。この API は、インテリジェントな脅威の JavaScript APIs の機能を活用して、エンドユーザーが CAPTCHA パズルを正常に完了した後に AWS WAF トークンを取得して使用します。

JavaScript 統合を最初にテスト環境で実装し、次に本番環境で実装します。追加のコーディングガイダンスについては、次のセクションを参照してください。

**CAPTCHA 統合 API を使用するには**

1. **API のインストール**

   1. にサインイン AWS マネジメントコンソール し、[https://console.aws.amazon.com/wafv2/homev2](https://console.aws.amazon.com/wafv2/homev2) で AWS WAF コンソールを開きます。

   1. ナビゲーションペインで、**[Application integration]** (アプリケーション統合) を選択します。**[アプリケーション統合]** ページに、タブ付きのオプションが表示されます。

   1. **[CAPTCHA 統合]** を選択します。

   1. リストされている JavaScript 統合スクリプトタグをコピーして、統合で使用します。

   1. `<head>` セクションのアプリケーションページコードに、コピーしたスクリプトタグを挿入します。これにより、CAPTCHA パズルの設定および使用が可能になります。

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

      この `<script>` リストは `defer` 属性で設定されていますが、ページに別の動作が必要な場合は、設定を `async` に変更できます。

      また、CAPTCHA スクリプトは、インテリジェントな脅威に対応した統合のスクリプトがまだ存在しない場合は自動的にロードします。インテリジェントな脅威に対応した統合のスクリプトにより、クライアントアプリケーションは、ページをロードする際にバックグラウンドでトークンを自動的に取得し、CAPTCHA API の使用に必要なその他のトークン管理機能を提供します。

1. **(オプション) クライアントのトークンにドメイン設定を追加する** – デフォルトでは、 がトークン AWS WAF を作成すると、保護パック (ウェブ ACL) に関連付けられているリソースのホストドメインが使用されます。JavaScript API に追加のドメインを指定するには、「[トークンで使用するドメインの提供](waf-js-challenge-api-set-token-domain.md)」のガイダンスに従ってください。

1. **クライアントの暗号化された API キーを取得する** – CAPTCHA API には、有効なクライアントドメインのリストを含む暗号化された API キーが必要です。 はこのキー AWS WAF を使用して、統合で使用しているクライアントドメインが CAPTCHA AWS WAF の使用が承認されていることを確認します。API キーを生成するには、「[JS CAPTCHA API の API キーの管理](waf-js-captcha-api-key.md)」のガイダンスに従ってください。

1. **CAPTCHA ウィジェットの実装をコーディングする** – `renderCaptcha()` API コールを、ページ内の使用したい場所に実装します。この機能の設定および使用方法については、以下のセクション「[CAPTCHA JavaScript API 仕様](waf-js-captcha-api-specification.md)」と「[CAPTCHA パズルをレンダリングする方法](waf-js-captcha-api-render.md)」を参照してください。

   CAPTCHA 実装は、トークン管理と AWS WAF トークンを使用するフェッチ呼び出しを実行するためのインテリジェントな脅威統合 APIs と統合されます。これらの API の使用に関するガイダンスについては、「[インテリジェントな脅威に対応した JavaScript API の使用](waf-js-challenge-api.md)」を参照してください。

1. **保護パック (ウェブ ACL) にトークン検証を追加する** – クライアントで送信するウェブリクエスト内に有効な CAPTCHA トークンがないかチェックするルールを、保護パック (ウェブ ACL) に少なくとも 1 つ追加します。「[CAPTCHA および Challengeの AWS WAF](waf-captcha-and-challenge.md)」の説明に従い、CAPTCHA ルールアクションを使用してチェックします。

   保護パック (ウェブ ACL) の追加により、保護されたエンドポイントに送信されるリクエストに、クライアント統合で取得したトークンが含まれていることを確認できます。有効で期限が切れていない CAPTCHA トークンを含むリクエストは、CAPTCHA ルールアクション検査に合格し、エンドユーザーに別の CAPTCHA パズルを提示することはありません。

JavaScript API を実装したら、CAPTCHA パズルの試行とソリューションの CloudWatch メトリクスを確認できます。メトリクスとディメンションの詳細については、[アカウントメトリクスとディメンション](waf-metrics.md#waf-metrics-account) を参照してください。

**Topics**
+ [CAPTCHA JavaScript API 仕様](waf-js-captcha-api-specification.md)
+ [CAPTCHA パズルをレンダリングする方法](waf-js-captcha-api-render.md)
+ [からの CAPTCHA レスポンスの処理 AWS WAF](waf-js-captcha-api-conditional.md)
+ [JS CAPTCHA API の API キーの管理](waf-js-captcha-api-key.md)

# CAPTCHA JavaScript API 仕様
<a name="waf-js-captcha-api-specification"></a>

このセクションでは、CAPTCHA JavaScript API のメソッドとプロパティの仕様を一覧表示します。CAPTCHA JavaScript API を使用して、クライアントアプリケーションでカスタム CAPTCHA パズルを実行します。

この API は、 AWS WAF トークンの取得と使用を設定および管理するために使用するインテリジェントな脅威 APIs に基づいています。「[インテリジェントな脅威に対応した API 仕様](waf-js-challenge-api-specification.md)」を参照してください。

**`AwsWafCaptcha.renderCaptcha(container, configuration)`**  
エンドユーザーに AWS WAF CAPTCHA パズルを提示し、成功すると、CAPTCHA 検証でクライアントトークンを更新します。これは CAPTCHA 統合でのみ使用できます。この呼び出しをインテリジェントな脅威に対応した API と組み合わせて使用すると、トークンの取得を管理したり、`fetch` コールでトークンを提供したりできます。インテリジェントな脅威に対応した API については、「[インテリジェントな脅威に対応した API 仕様](waf-js-challenge-api-specification.md)」を参照してください。  
が AWS WAF 送信する CAPTCHA インタースティシャルとは異なり、この方法でレンダリングされた CAPTCHA パズルは、最初のタイトル画面なしですぐにパズルを表示します。    
**`container`**  
ページ上のターゲットとなるコンテナ要素の `Element` オブジェクト。これは通常、`document.getElementById()` または `document.querySelector()` を呼び出すことで取得できます。  
必須: はい  
タイプ: `Element`  
**設定**  
以下のような CAPTCHA 構成設定を含むオブジェクト****。    
**`apiKey`**   
クライアントのドメインの許可を有効にする暗号化された API キー。 AWS WAF コンソールを使用して、クライアントドメインの API キーを生成します。1 つのキーを最大 5 つのドメインに使用できます。詳細については、「[JS CAPTCHA API の API キーの管理](waf-js-captcha-api-key.md)」を参照してください。  
必須: はい  
タイプ: `string`  
**`onSuccess: (wafToken: string) => void;`**   
エンドユーザーが CAPTCHA パズルを正常に完了すると、有効な AWS WAF トークンで呼び出されます。 AWS WAF 保護パック (ウェブ ACL) で保護するエンドポイントに送信するリクエストでトークンを使用します。トークンは、パズルの完成に最後に成功したときの証明とタイムスタンプを提供します。  
必須: はい  
**`onError?: (error: CaptchaError) => void;`**   
CAPTCHA 操作中にエラーが発生したときに、エラーオブジェクトとともに呼び出されます。  
必須: いいえ  
**`CaptchaError` クラス定義** – `onError` ハンドラーは、次のクラス定義を使用してエラータイプを提供します。  

```
CaptchaError extends Error {
    kind: "internal_error" | "network_error" | "token_error" | "client_error";
    statusCode?: number;
}
```
+ `kind` – 返されたエラーの種類。
+ `statusCode` – HTTP ステータスコード (利用可能な場合)。これは、エラーが HTTP エラーに起因する場合に `network_error` で使用されます。  
**`onLoad?: () => void;`**   
新しい CAPTCHA パズルがロードされると呼び出されます。  
必須: いいえ  
**`onPuzzleTimeout?: () => void;`**   
CAPTCHA パズルが期限切れになる前に完成しなかった場合に呼び出されます。  
必須: いいえ  
**`onPuzzleCorrect?: () => void;`**   
CAPTCHA パズルに正しい回答が入力されると呼び出されます。  
必須: いいえ  
**`onPuzzleIncorrect?: () => void;`**   
CAPTCHA パズルに間違った回答が入力されると呼び出されます。  
必須: いいえ  
**`defaultLocale`**   
CAPTCHA パズルに使用するデフォルトのロケール。CAPTCHA パズルの説明書は、アラビア語 (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` に設定すると、CAPTCHA パズルの言語セレクタが非表示になります。  
デフォルト: `false`  
必須: いいえ  
タイプ: `boolean`  
**`dynamicWidth`**   
`true` に設定すると、CAPTCHA パズルの幅はブラウザウィンドウの幅に合わせて変更されます。  
デフォルト: `false`  
必須: いいえ  
タイプ: `boolean`  
**`skipTitle`**   
`true` に設定すると、CAPTCHA パズルのパズルタイトルに「**パズルを解く**」という見出しが表示されません。  
デフォルト: `false`  
必須: いいえ  
タイプ: `boolean`

# CAPTCHA パズルをレンダリングする方法
<a name="waf-js-captcha-api-render"></a>

このセクションでは、`renderCaptcha` の実施例を示します。

クライアントインターフェイスで使用する 呼び出しを使用できます AWS WAF `renderCaptcha`。呼び出しは、CAPTCHA パズルを から取得し AWS WAF、レンダリングして、検証 AWS WAF のために に送信します。呼び出しを行うときは、パズルのレンダリング設定と、エンドユーザーがパズルを完成させたときに実行するコールバックを指定します。オプションの詳細については、前のセクション「[CAPTCHA JavaScript API 仕様](waf-js-captcha-api-specification.md)」を参照してください。

この呼び出しは、インテリジェントな脅威に対応した統合 API のトークン管理機能と組み合わせて使用します。この呼び出しにより、CAPTCHA パズルの完成に成功したことを検証するトークンがクライアントに渡されます。インテリジェントな脅威統合 APIs を使用してトークンを管理し、 AWS WAF 保護パック (ウェブ ACLs) で保護されているエンドポイントへのクライアントの呼び出しでトークンを提供します。インテリジェントな脅威に対応した API の詳細については、「[インテリジェントな脅威に対応した JavaScript API の使用](waf-js-challenge-api.md)」を参照してください。

**実装例**  
次のリスト例は、 `<head>`セクション AWS WAF の統合 URL の配置を含む、標準の CAPTCHA 実装を示しています。

このリストは、インテリジェントな脅威に対応した統合 API の `AwsWafIntegration.fetch` ラッパーを使用する成功コールバックを含む `renderCaptcha` 関数で構成されています。この関数については、「[統合 `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
        });
```

設定オプションの詳細な情報については、「[CAPTCHA JavaScript API 仕様](waf-js-captcha-api-specification.md)」を参照してください。

# からの CAPTCHA レスポンスの処理 AWS WAF
<a name="waf-js-captcha-api-conditional"></a>

このセクションでは、CAPTCHA レスポンスを処理する例を示します。

CAPTCHA アクションを持つ AWS WAF ルールは、リクエストに有効な CAPTCHA タイムスタンプを持つトークンがない場合、一致するウェブリクエストの評価を終了します。リクエストが `GET` テキスト/HTML 呼び出しの場合、CAPTCHA アクションは CAPTCHA パズルを含むインタースティシャルをクライアントに提供します。CAPTCHA JavaScript API を統合しない場合、インタースティシャルはパズルを実行し、エンドユーザーが問題を正しく解決すると、自動的にリクエストを再送信します。

CAPTCHA JavaScript API を統合し、CAPTCHA 処理をカスタマイズする場合は、終了 CAPTCHA レスポンスを検出し、カスタム CAPTCHA を提供する必要があります。その後、エンドユーザーがパズルを正しく解決した場合は、クライアントのウェブリクエストを再送信します。

次のコード例は、これを実行する方法を説明しています。

**注記**  
 AWS WAF CAPTCHA アクションレスポンスのステータスコードは HTTP 405 で、このコードのCAPTCHAレスポンスを認識するために使用します。保護されたエンドポイントが HTTP 405 ステータスコードを使用して同じ呼び出しのために他の種類のレスポンスを通信する場合、このサンプルコードはそれらのレスポンスのためにも CAPTCHA パズルをレンダリングします。

```
<!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 キーを生成および削除する手順について説明します。

JavaScript API を使用して AWS WAF CAPTCHA をクライアントアプリケーションに統合するには、JavaScript API 統合タグと、CAPTCHA パズルを実行するクライアントドメインの暗号化された API キーが必要です。

JavaScript の CAPTCHA アプリケーション統合では、暗号化された API キーを使用して、クライアントアプリケーションドメインに CAPTCHA API AWS WAF を使用するアクセス許可があることを確認します。JavaScript クライアントから CAPTCHA API を呼び出すときは、現在のクライアントのドメインを含むドメインリストに API キーを含めます。1 つの暗号化キーに最大 5 つのドメインを列挙することができます。

**API キー要件**  
CAPTCHA 統合で使用する API キーには、そのキーを使用するクライアントに適用されるドメインが含まれている必要があります。
+ クライアントのインテリジェントな脅威に対応した統合で `window.awsWafCookieDomainList` を指定する場合、API キーの少なくとも 1 つのドメインが `window.awsWafCookieDomainList` のトークンドメインの 1 つと完全一致するか、いずれかのトークンドメインの apex ドメインである必要があります。

  例えば、トークンドメイン `mySubdomain.myApex.com` の場合、API キー `mySubdomain.myApex.com` は完全に一致し、API キー `myApex.com` は apex ドメインです。どちらかのキーがトークンドメインに一致します。

  トークンドメインリストの設定については、「[トークンで使用するドメインの提供](waf-js-challenge-api-set-token-domain.md)」を参照してください。
+ それ以外の場合は、現在のドメインが API キーに含まれている必要があります。現在のドメインは、ブラウザのアドレスバーで確認できるドメインです。

使用するドメインは、保護されたホストドメインとウェブ ACL 用に設定されたトークンドメインリストに基づいて、 が AWS WAF 受け入れるドメインである必要があります。詳細については、「[AWS WAF 保護パック (ウェブ ACL) トークンドメインリスト設定](waf-tokens-domains.md#waf-tokens-domain-lists)」を参照してください。

**API キーのリージョンを選択する方法**  
AWS WAF は、 AWS WAF が利用可能な任意のリージョンで CAPTCHA API キーを生成できます。

原則として、保護パック (ウェブ ACL) に使用するのと同じリージョンを CAPTCHA API キーに使用する必要があります。ただし、リージョナル保護パック (ウェブ ACL) のグローバルオーディエンスが予想される場合は、CloudFront にスコープされた CAPTCHA JavaScript 統合タグと CloudFront にスコープされた API キーを取得し、リージョナル保護パック (ウェブ ACL) で使用できます。このアプローチにより、クライアントは自分に最も近いリージョンから CAPTCHA パズルをロードできるため、レイテンシーが短縮されます。

CloudFront 以外のリージョンに限定されている CAPTCHA API キーは、複数のリージョンでは使用できません。これらは、限定されたリージョンでのみ使用できます。

**クライアントドメインの API キーを生成するには**  
統合 URL を取得し、コンソールを介して API キーを生成および取得するには。

1. にサインイン AWS マネジメントコンソール し、[https://console.aws.amazon.com/wafv2/homev2](https://console.aws.amazon.com/wafv2/homev2) で AWS WAF コンソールを開きます。

1. ナビゲーションペインで、**[Application integration]** (アプリケーション統合) を選択します。

1. ペインで、**[アプリケーション統合のために有効にする保護パック (ウェブ ACL)]** で、API キーに使用したいリージョンを選択します。**[CAPTCHA 統合]** タブの **[API キー]** ペインでリージョンを選択することもできます。

1. タブ **[CAPTCHA 統合]** を選択します。このタブには、統合で使用できる CAPTCHA JavaScript 統合タグと API キーリストが表示されます。どちらも選択したリージョンに限定されます。

1. **[API キー]** ペインで、**[キーを生成]** を選択します。[キー生成] ダイアログが表示されます。

1. キーに含めるクライアントドメインを入力します。最大 5 つまで入力できます。完了したら、**[キーを生成]** を選択します。インターフェイスが CAPTCHA 統合タブに戻り、新しいキーが一覧表示されます。

   一度作成された API キーは、イミュータブルです。キーを変更する必要がある場合は、新しいキーを生成し、代わりにそれを使用します。

1. (オプション) 新しく生成されたキーをコピーして、統合で使用します。

この作業には、REST APIs または言語固有の AWS SDKsのいずれかを使用することもできます。REST API コールは 「[CreateAPIKey](https://docs.aws.amazon.com/waf/latest/APIReference/API_CreateAPIKey.html)」と「[ListAPIKeys](https://docs.aws.amazon.com/waf/latest/APIReference/API_ListAPIKeys.html)」です。

**API を削除するには**  
API キーを削除するには、REST API または言語固有の AWS SDKsのいずれかを使用する必要があります。REST API コールは 「[DeleteAPIKey](https://docs.aws.amazon.com/waf/latest/APIReference/API_DeleteAPIKey.html)」です。コンソールでキーを削除することはできません。

キーを削除すると、 がすべてのリージョンでキーの使用を禁止する AWS WAF までに最大 24 時間かかることがあります。