> ## Documentation Index
> Fetch the complete documentation index at: https://docs-dev-actions-triggers-prototype.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# 暗黙フロー使用時にリプレイ攻撃を軽減する

> フォームPOSTを使用した暗黙フローで使うために、暗号ノンスを安全に生成して検証する方法について説明します。

[フォームPOSTを使用した暗黙フロー](/docs/ja-jp/get-started/authentication-and-authorization-flow/implicit-flow-with-form-post)でリプレイ攻撃を軽減するために、認証要求では必ずノンスを送信しなければなりません。これは[OpenID Connect（OIDC）の仕様でも要求](https://openid.net/specs/openid-connect-core-1_0.html#ImplicitAuthRequest)されています。

ノンスはアプリケーションが生成し、`nonce`クエリ文字列パラメーターとして認可要求に含めて送信され、Auth0からのIDトークン応答に含まれます。そうすることで、アプリケーションはAuth0からのIDトークン応答と当初の認証要求を相互に関連付けることができます。

ノンスを含める場所については、「[フォームPOSTを使用した暗黙フローでログインを追加する](/docs/ja-jp/get-started/authentication-and-authorization-flow/implicit-flow-with-form-post/add-login-using-the-implicit-flow-with-form-post)」を参照してください。

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  [cross-origin認証](/docs/ja-jp/authenticate/login/cross-origin-authentication)を使用している場合は、[Auth0.js](/docs/ja-jp/libraries/auth0js)が`state`パラメーターと`nonce`パラメーターを管理します。
</Callout>

## 暗号的にランダムのノンスを生成する

暗号的にランダムのノンスを生成するには、1つの方法として[Nano ID](https://github.com/ai/nanoid)などのツールを使用することができます。ただし、ツールとJavaScriptコードをバンドルする必要があります。それが不可能な場合には、[最新のブラウザー](http://caniuse.com/#feat=cryptography)が[Web Crypto API](https://www.w3.org/TR/WebCryptoAPI/)を使用して暗号的に安全なランダムの文字列をノンス用に生成できることを活用することができます。

```javascript lines theme={null}
function randomString(length) {
    var charset = '0123456789ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz+/'
    result = ''

    while (length > 0) {
        var bytes = new Uint8Array(16);
        var random = window.crypto.getRandomValues(bytes);

        random.forEach(function(c) {
            if (length == 0) {
                return;
            }
            if (c < charset.length) {
                result += charset[c];
                length--;
            }
        });
    }
    return result;
}
```

## 要求間でノンスを保持する

生成されたノンスは、以下の方法を使って、Webアプリケーションで保持されなければなりません。

* `HttpOnly`セッションクッキー
* HTML5のローカルストレージ値

例：

```javascript lines theme={null}
window.localStorage.setItem('nonce', randomString(16));
```

## IDトークンを検証する

Auth0が[IDトークン](/docs/ja-jp/secure/tokens/id-tokens)で応答したら、このトークンを通常通りに[検証してデコード](/docs/ja-jp/secure/tokens/id-tokens/validate-id-tokens)する必要があります。`nonce`クレームには、要求で送信したのと完全に同じ値が含まれていなければなりません。そうでない場合には、アプリケーションが認証を拒否する必要があります。

```javascript lines theme={null}
var jwt = '...'; // validated and decoded ID Token body
if (jwt.nonce === window.localStorage.getItem('nonce')) {
    // Nonce is OK
} else {
    // Nonce is not OK! Token replay attack might be underway
}
```

## もっと詳しく

* [フォームPOSTを使った暗黙フロー](/docs/ja-jp/get-started/authentication-and-authorization-flow/implicit-flow-with-form-post)
* [フォームPOSTを使った暗黙フローでログインを追加する](/docs/ja-jp/get-started/authentication-and-authorization-flow/implicit-flow-with-form-post/add-login-using-the-implicit-flow-with-form-post)
* [OIDCを使った暗黙フロー](/docs/ja-jp/authenticate/login/oidc-conformant-authentication/oidc-adoption-implicit-flow)
