30

HTTPダイジェスト認証を必要とするリクエストを送信しようとしています。

jQueryでダイジェストは可能ですか?

もしそうなら、これはそれを行う正しい方法に近いですか?現在は機能していません。

<script type="text/javascript">
    $.ajax({
        url: url,
        type: 'GET',
        dataType: 'json',
        success: function() { alert('hello!'); },
        error: function() { alert('error')},
        beforeSend: setHeader

    });

    function setHeader(xhr){
        xhr.setRequestHeader("Authorization", "Digest username:password");
        xhr.setRequestHeader("Accept", "application/json");
    }
</script>
4

3 に答える 3

50

いいえ、ダイジェストアクセス認証スキームは、次の手順を必要とするチャレンジ/レスポンス認証メカニズムを実装しているため、もう少し複雑です。

  1. クライアントはアクセス保護されたリソースの要求を送信しますが、受け入れ可能な承認ヘッダーフィールドは送信されません
  2. サーバーは「401Unauthorized」ステータスコードとWWW-Authenticateヘッダーフィールド(digest-challenge)で応答します
  3. クライアントは、同じリソースに対して別のリクエストを送信しますが、チャレンジに応答してAuthorizationヘッダーフィールドを含みます(digest-response
  4. 許可が成功しない場合は、ステップ2に進みます。それ以外の場合、サーバーは通常どおり続行します。

これは、少なくとも2つの要求/応答ペアがあることを意味します。

WWW-Authenticate応答ヘッダーフィールドの構文は次のとおりです。

challenge        =  "Digest" digest-challenge
digest-challenge  = 1#( realm | [ domain ] | nonce |
                    [ opaque ] |[ stale ] | [ algorithm ] |
                    [ qop-options ] | [auth-param] )

したがって、ダイジェストチャレンジを解析して、次の構文でAuthorizationリクエストヘッダーフィールドのダイジェスト応答を生成できるようにするパラメータを取得する必要があります。

credentials      = "Digest" digest-response
digest-response  = 1#( username | realm | nonce | digest-uri
                | response | [ algorithm ] | [cnonce] |
                [opaque] | [message-qop] |
                    [nonce-count]  | [auth-param] )

このセクションでは、ダイジェスト応答パラメーターの計算方法についても説明します。特に、この認証スキームで最も一般的に使用されるアルゴリズムであるMD5実装が必要になる可能性があります。

これがあなたが始めることができる簡単なトークン化です:

var ws = '(?:(?:\\r\\n)?[ \\t])+',
    token = '(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2E\\x30-\\x39\\x3F\\x41-\\x5A\\x5E-\\x7A\\x7C\\x7E]+)',
    quotedString = '"(?:[\\x00-\\x0B\\x0D-\\x21\\x23-\\x5B\\\\x5D-\\x7F]|'+ws+'|\\\\[\\x00-\\x7F])*"',
    tokenizer = RegExp(token+'(?:=(?:'+quotedString+'|'+token+'))?', 'g');
var tokens = xhr.getResponseHeader("WWW-Authentication").match(tokenizer);

これにより、WWW-Authenticateヘッダーフィールドが次のようになります。

WWW-Authenticate: Digest
        realm="testrealm@host.com",
        qop="auth,auth-int",
        nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
        opaque="5ccc069c403ebaf9f0171e9517f40e41"

の中へ:

['Digest', 'realm="testrealm@host.com"', 'qop="auth,auth-int"', 'nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093"', 'opaque="5ccc069c403ebaf9f0171e9517f40e41"']

次に、パラメーターを解析し(存在と妥当性を確認)、値を抽出する必要があります。引用符で囲まれた文字列の値は折りたたむことができるため、展開する必要があることに注意してください( unqRFCのunquote関数の使用も参照してください)。

function unq(quotedString) {
    return quotedString.substr(1, quotedString.length-2).replace(/(?:(?:\r\n)?[ \t])+/g, " ");
}

これを使用すると、自分でそれを実装できるはずです。

于 2011-03-13T10:06:08.323 に答える
4

バニラJavaScriptで可能です。digestAuthRequest.jsを試してください:

https://github.com/inorganik/digest-auth-request

于 2014-02-28T17:54:52.600 に答える
3

あなたはdigestjjqueryプラグインを試してみるべきです。

http://code.google.com/p/digestj/

これは部分的な実装ですが、やり遂げるのに十分な場合があります。

于 2011-03-13T10:42:25.783 に答える