如何正确获取摘要式身份验证
How to get Digest authentication right
我尝试编写一个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
是我们刚刚计算的值,随机数取自上面的服务器响应,总共是: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/(进行手动计算。
我在这里是否遗漏了一些明显的东西,可能在某种程度上误解了标准?为什么我无法获得授权?
终于明白了。身份验证本身是完全正确的。
服务器要求设置cookie。显然,也必须在回复中显示该饼干。这就解释了为什么Firefox(作为一个浏览器(可以正确进行身份验证,而curl和lwp-request不能坚持标准 - RFC没有提到cookie。为什么我们有没有人关心的标准?
无论如何,将Cookie: fake=fake_value
附加到标头可以解决问题。
- LibGit2 SSH身份验证失败
- 为什么 WinInet 在通过 FQDN 连接时无法通过协商自动进行身份验证,但如果通过 IP 连接则成功?
- 如何通过NetHTTPClient在HTTPS中进行身份验证
- 处理身份验证弹出窗口在wxWebView
- 如何测试我的谷歌身份验证器实现?
- 通过 Boost 和 C++ 进行 SMTP 身份验证
- libtorrent是否支持带摘要身份验证的http web种子
- 将Windows身份验证与cpprestsdk一起使用
- OCCI:使用SSL钱包身份验证连接到OracleDB
- 为什么我不能使用外围设备进行身份验证
- 无法使用C++代码向MongoDB进行身份验证
- 模拟的 HTTP 身份验证仅在本地主机上工作
- 使用OpenSSL的SHA 512 HMAC消息身份验证的问题
- Windows 套接字和身份验证构建在包含 Poco-Library 时失败
- 如何对进程进行身份验证
- 如何使用GSOAP初始化服务器上下文以启用简单身份验证(仅服务器身份验证)
- 解析 HTTP 的摘要式身份验证的正确正则表达式模式是什么?
- 在 SSH 上的公钥-私钥身份验证上的 libcurl 实现
- 如何正确获取摘要式身份验证
- 通过cURL使用NTLM的代理身份验证返回407,即使有正确的凭据