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

フォームPOSTを使用した暗黙フローでリプレイ攻撃を軽減するために、認証要求では必ずノンスを送信しなければなりません。これはOpenID Connect(OIDC)の仕様でも要求されています。

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

ノンスを含める場所については、「フォームPOSTを使用した暗黙フローでログインを追加する」を参照してください。

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

暗号的にランダムのノンスを生成するには、1つの方法としてNano IDなどのツールを使用することができます。ただし、ツールとJavaScriptコードをバンドルする必要があります。それが不可能な場合には、最新のブラウザーWeb Crypto APIを使用して暗号的に安全なランダムの文字列をノンス用に生成できることを活用することができます。

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;
}

Was this helpful?

/

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

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

  • HttpOnlyセッションクッキー

  • HTML5のローカルストレージ値

例:

window.localStorage.setItem('nonce', randomString(16));

Was this helpful?

/

IDトークンを検証する

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

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
}

Was this helpful?

/

もっと詳しく