Mit*_*civ 30 jquery digest-authentication
我正在尝试发送需要HTTP摘要身份验证的请求.
在jQuery中可以使用Digest吗?
如果是这样,这是否接近正确的方法呢?它目前无法正常工作.
<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>
Run Code Online (Sandbox Code Playgroud)
Gum*_*mbo 48
不,摘要访问身份验证方案稍微复杂一些,因为它实现了质询 - 响应身份验证机制,需要执行以下步骤:
这意味着至少有两个请求/响应对.
每个WWW-Authenticate响应头字段都具有以下语法:
Run Code Online (Sandbox Code Playgroud)challenge = "Digest" digest-challenge digest-challenge = 1#( realm | [ domain ] | nonce | [ opaque ] |[ stale ] | [ algorithm ] | [ qop-options ] | [auth-param] )
因此,您需要解析摘要挑战以获取参数,以便能够使用以下语法为Authorization请求标头字段生成摘要响应:
Run Code Online (Sandbox Code Playgroud)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);
Run Code Online (Sandbox Code Playgroud)
这将转换WWW-Authenticate标头字段,如:
WWW-Authenticate: Digest
realm="testrealm@host.com",
qop="auth,auth-int",
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
opaque="5ccc069c403ebaf9f0171e9517f40e41"
Run Code Online (Sandbox Code Playgroud)
成:
['Digest', 'realm="testrealm@host.com"', 'qop="auth,auth-int"', 'nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093"', 'opaque="5ccc069c403ebaf9f0171e9517f40e41"']
Run Code Online (Sandbox Code Playgroud)
然后,您需要解析参数(检查存在性和有效性)并提取值.请注意,引用字符串值可以折叠,因此您需要展开它们(另请参阅unqRFC中使用unquote函数):
function unq(quotedString) {
return quotedString.substr(1, quotedString.length-2).replace(/(?:(?:\r\n)?[ \t])+/g, " ");
}
Run Code Online (Sandbox Code Playgroud)
有了这个,你应该能够自己实现它.