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

时间:2011-03-13 07:49:08

标签: jquery digest-authentication

我正在尝试发送需要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>

3 个答案:

答案 0 :(得分:47)

不,Digest Access Authentication Scheme稍微复杂一点,因为它实现了challenge-response authentication mechanism,需要执行以下步骤:

  1. 客户端发送受访问保护资源的请求,但未发送可接受的授权标头字段
  2. 服务器以“401 Unauthorized”状态代码和 WWW-Authenticate 标头字段( digest-challenge )进行响应
  3. 客户端发送另一个相同资源的请求但包含授权标头字段以响应质询(摘要 - 响应
  4. 如果授权不成功,请转到步骤2;否则服务器正常进行。
  5. 这意味着至少有两个请求/响应对。

    每个WWW-Authenticate response header field都有以下语法:

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

    因此,您需要解析 digest-challenge 以获取参数,以便能够使用以下语法为Authorization request header field生成摘要 - 响应

    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"']
    

    然后你需要解析参数(检查存在性和有效性)并提取值。请注意, quoted-string 值可以折叠,因此您需要展开它们(另请参阅RFC中使用非引号函数unq):

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

    有了这个,你应该能够自己实现它。

答案 1 :(得分:4)

可以使用vanilla javascript。尝试摘要Auth Request.jsp>

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

答案 2 :(得分:3)

你应该尝试使用digestj jquery插件。

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

这是部分实施,但足以帮助您度过难关。