メインコンテンツへスキップ
Form Post を使用したインプリシットフロー の使用時にリプレイ攻撃を軽減するには、OpenID Connect (OIDC) 仕様で要求されているとおり、認証リクエストで を送信する必要があります。 nonce はアプリケーションで生成され、認証リクエストの nonce クエリ文字列パラメータとして送信され、Auth0 から返される レスポンスに含まれます。これにより、アプリケーションは Auth0 からの IDトークン レスポンスを元の認証リクエストに対応付けることができます。 nonce をどこに含めるかについて詳しくは、Add Login Using the Implicit Flow with Form Post を参照してください。
Auth0.js は、クロスオリジン認証 の使用時に state パラメータと nonce パラメータを自動的に管理します。

暗号学的にランダムな nonce を生成する

暗号学的にランダムな nonce を生成する方法の 1 つは、Nano ID などのツールや同様のライブラリを使用することです。ただし、この方法ではそのツールを JavaScript コードにバンドルする必要があります。それが難しい場合は、最新のブラウザー では Web Crypto API を使用して、nonce として利用できる暗号学的に安全なランダム文字列を生成できます。
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;
}

リクエスト間で nonce を保持する

生成した nonce は、次のいずれかの方法で Web アプリケーション内に保持する必要があります。
  • HttpOnly
  • HTML5 ローカルストレージの値
例:
window.localStorage.setItem('nonce', randomString(16));

IDトークンを検証する

Auth0 から IDトークン が返されたら、このトークンは通常どおり検証およびデコードする必要があります。 nonce クレームには、リクエストで送信した値と完全に同じ値が含まれている必要があります。 そうでない場合、アプリケーションは認証を拒否する必要があります。
var jwt = '...'; // 検証済みおよびデコード済みのIDトークン本文
if (jwt.nonce === window.localStorage.getItem('nonce')) {
    // Nonceは正常です
} else {
    // Nonceが不正です!トークンリプレイ攻撃が発生している可能性があります
}

詳細情報