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>
いいえ、 ダイジェストアクセス認証方式 は チャレンジ-応答認証メカニズム を実装しているため、少し複雑ですが、次の手順が必要です。
これは、少なくとも2つの要求/応答ペアがあることを意味します。
各 WWW-Authenticate応答ヘッダーフィールド の構文は次のとおりです。
challenge = "Digest" digest-challenge digest-challenge = 1#( realm | [ domain ] | nonce | [ opaque ] |[ stale ] | [ algorithm ] | [ qop-options ] | [auth-param] )
したがって、digest-challengeを解析して、パラメータを取得してdigest-reponseを生成できるようにする必要があります- Authorizationリクエストヘッダーフィールド 次の構文:
credentials = "Digest" digest-response digest-response = 1#( username | realm | nonce | digest-uri | response | [ algorithm ] | [cnonce] | [opaque] | [message-qop] | [nonce-count] | [auth-param] )
そのセクションでは、digest-responseパラメータの計算方法についても説明しています。特に、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="[email protected]",
qop="auth,auth-int",
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
opaque="5ccc069c403ebaf9f0171e9517f40e41"
に:
['Digest', 'realm="[email protected]"', 'qop="auth,auth-int"', 'nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093"', 'opaque="5ccc069c403ebaf9f0171e9517f40e41"']
次に、パラメーターを解析し(存在と有効性を確認)、値を抽出する必要があります。 quoted-string値は折りたたむことができるので、展開する必要があることに注意してください(RFCのunquote関数unq
の使用も参照):
function unq(quotedString) {
return quotedString.substr(1, quotedString.length-2).replace(/(?:(?:\r\n)?[ \t])+/g, " ");
}
これにより、それを自分で実装できるはずです。
バニラJavaScriptで可能です。 digestAuthRequest.jsを試してください。