我尝试编写C ++ - 应用程序,我必须进行HTTP摘要式身份验证。问题主要不是关于C ++,而是关于连接没有建立的事实。我尝试访问的网站如下:httpbin.org/digest-auth/auth/user/passwd。
考虑以下服务器对简单GET /digest-auth/auth/user/passwd
的响应:
HTTP/1.1 401 UNAUTHORIZED
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Content-Type: text/html; charset=utf-8
Date: Mon, 08 Sep 2014 15:10:09 GMT
Server: gunicorn/18.0
Set-Cookie: fake=fake_value
Www-Authenticate: Digest realm="me@kennethreitz.com", nonce="2a932bfb1f9a748a7b5ee590d0cf99e0", qop=auth, opaque="2d09668631b42bff8375523e7b27e45e"
Content-Length: 0
Connection: keep-alive
A1
计算为user:me@kennethreitz.com:passwd
并将其散列为4de666b60f91e2444f549243bed5fa4b
,我将其称为HA1。
A2
被计算为GET:/digest-auth/auth/user/passwd
并被散列为b44272ea65ee4af7fb26c5dba58f6863
,我将其称为HA2。
使用此信息,响应计算为HA1:nonce:1:ac3yyj:auth:HA2
,其中HA1
和HA2
是我们刚刚计算出的值,而nonce取自上面的服务器响应,即总计:4de666b60f91e2444f549243bed5fa4b:2a932bfb1f9a748a7b5ee590d0cf99e0:1:ac3yyj:auth:b44272ea65ee4af7fb26c5dba58f6863
。哈希是55f292e183ead0810528bb2a13b98e00
。
组合所有这些信息应足以使用摘要式身份验证建立http连接。但是,服务器拒绝了以下请求,并使用其他HTTP/1.1 401
回复。
GET /digest-auth/auth/user/passwd HTTP/1.1
Host: httpbin.org
Authorization: Digest username="user", realm="me@kennethreitz.com",nonce="2a932bfb1f9a748a7b5ee590d0cf99e0",uri="/digest-auth/auth/user/passwd",qop=auth,nc=1,cnonce="ac3yyj",response="55f292e183ead0810528bb2a13b98e00",opaque="2d09668631b42bff8375523e7b27e45e"
请注意,格式化不会显示请求的结构。从授权到不透明的块实际上是一行。
随意重新进行md5计算 - 但我手动重做计算并获得与程序相同的哈希值。我使用该工具(http://md5-hash-online.waraxe.us/)进行手动计算。
我在这里遗漏了一些明显的东西,可能在某种程度上误解了标准吗?为什么我不能获得授权?
答案 0 :(得分:0)
终于明白了。身份验证本身是完全正确的。
服务器要求设置cookie。显然,必须在响应中显示cookie。这就解释了为什么firefox(作为浏览器)可以正确验证,而curl和lwp-request虽然不能遵守标准 - RFC没有提及任何关于cookie的信息。为什么我们有标准,没有人关心?
无论如何,将Cookie: fake=fake_value
附加到标题可以解决问题。