使用jQuery可以进行摘要式身份验证吗?

我正在尝试发送需要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>
    
已邀请:
不,摘要访问身份验证方案稍微复杂一些,因为它实现了质询 - 响应身份验证机制,需要执行以下步骤: 客户端发送对受访问保护的资源的请求,但不发送可接受的授权头字段 服务器响应“401 Unauthorized”状态代码和WWW-Authenticate头字段(摘要挑战) 客户端发送另一个相同资源的请求但包含一个Authorization头字段以响应质询(摘要响应) 如果授权不成功,请转到步骤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"']
然后,您需要解析参数(检查存在性和有效性)并提取值。请注意,引用字符串值可以折叠,因此您需要展开它们(另请参阅RFC中使用unquote函数
unq
):
function unq(quotedString) {
    return quotedString.substr(1, quotedString.length-2).replace(/(?:(?:rn)?[ t])+/g, " ");
}
有了这个,你应该能够自己实现它。     
有可能使用vanilla javascript。试试digestAuthRequest.js: https://github.com/inorganik/digest-auth-request     
你应该尝试digestj jquery插件。 http://code.google.com/p/digestj/ 这是部分实施,但可能足以帮助您完成。     

要回复问题请先登录注册