Javascript摘要手动身份验证

Kal*_*ico 7 javascript xmlhttprequest digest digest-authentication

我阅读了有关摘要认证的所有帖子,我正在尝试,但我有任何问题,我有一个实施摘要认证的restlet,并与javascript api我正在尝试进行身份验证.

首先,我对服务器执行xmlhttprequest POST(从file://到localhost:8111,因此我遇到了CORS问题但是已经解决了),以及服务器响应401和WWW-Authenticate标头:

WWW-Authenticate:Digest realm="Guard", domain="/",        nonce="MTMzOTA5Mjk1NTE2NDo0NzY2NjJiOTgyMjE1ZDc0OWU3NzM5MTkzMWNjNGQzNw==", algorithm=MD5, qop="auth"
Run Code Online (Sandbox Code Playgroud)

所以我采用这个标题并应用身份验证摘要算法:首先创建2个变量,"cnonce"和"nc":

tokensObj["cnonce"] = 'bd5fd9b093dccaa1'; (invented)
tokensObj["nc"] = '00000001';
Run Code Online (Sandbox Code Playgroud)

我在我的文字对象中创建'uri'参数(在服务器响应中有一个"域":?)我取'domain'的值并放入我的对象的'uri'键.

之后,我做了算法:

var HA1 = MD5("login:Guard:mypassword");
var HA2 = MD5("POST:/");
var authResponse = MD5(HA1 + ':' + 

        unquotes(tokensObj["nonce"]) +
        ':' +
        tokensObj["nc"] +
        ':' +
        tokensObj["cnonce"] +
        ':' +
                    unquotes(tokensObj["qop"]) +
        ':' +
        HA2);
var responseContentHeader = 'Digest username:"login"' +', realm=' + tokensObj["realm"] +
                           ', nonce=' + tokensObj["nonce"] +
                           ', uri=' + tokensObj["domain"]  +
               ', algorithm=' + tokensObj["algorithm"] +
               ', response="' + authResponse + '"' +
               ', qop=' + unquotes(tokensObj["qop"]) + 
               ', nc=' + tokensObj["nc"] +
               ', cnonce="' + tokensObj["cnonce"] + '"';
Run Code Online (Sandbox Code Playgroud)

我做了setRequestHeader("Authorization",responseContentHeader); 因此,发送到服务器的最终标头是:

Authorization:Digest username:"login", realm="Guard", nonce="7d0c753c2fb4cdc9480403547952f1", uri="/", algorithm=MD5, response="e9d8ad8f04e42672f2c21d70257c1072", qop=auth, nc=00000001, cnonce="bd5fd9b093dccaa1"
Run Code Online (Sandbox Code Playgroud)

但不起作用,服务器再次返回401,所有CORS标头都设置正常,所以不是问题,服务器认证摘要已经过测试,使用Chrome登录并且标题授权它与我的相同(很明显,nonce是不同的).

有人似乎有什么我可能去的?谢谢

Kal*_*ico 6

错误是username用冒号指定参数,它应该是等号(username:"login"vs username="login"):

Authorization: Digest username="login", realm="Guard", nonce="7d0c753c2fb4cdc9480403547952f1", uri="/", algorithm=MD5, response="e9d8ad8f04e42672f2c21d70257c1072", qop=auth, nc=00000001, cnonce="bd5fd9b093dccaa1"
Run Code Online (Sandbox Code Playgroud)