我有 1.) 客户端、2.) nginx 驱动的代理服务器和 3.) 一些客户端无法访问地址的服务器,代理处理从客户端到这些服务器的通信。
到目前为止运行良好。但现在其中一些服务器需要通过 HTTP 摘要而不是 HTTP 基本身份验证进行身份验证,并且客户端不再能够在这些服务器上正确进行身份验证。
感谢 wget 和 Wireshark,我能够稍微解决这个问题。
有效身份验证的 HTTP 标头如下所示:
GET /targetpath/myfile.jpg HTTP/1.1
User-Agent: Wget/1.15 (linux-gnu)
Accept: */*
Host: 192.168.5.215
Connection: Keep-Alive
Authorization: Digest username="myuser", realm="MyRealm", nonce="x+AfVa0pBQA=ad6ef47eb7e95f9fe8e148a9ccd22dcdb3b8a7f6", uri="/targetpath/myfile.jpg", response="6f7cf06ddededd7295ce3a16b4196528", qop=auth, nc=00000001, cnonce="26310a3e", algorithm="MD5"
代理完成的不起作用的身份验证的标头看起来有点不同:
GET /targetpath/myfile.jpg HTTP/1.0
Connection: Keep-Alive
Host: 192.168.5.215
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0
Referer: http://localhost/
Authorization: Digest username="MyUser", realm="MyRealm", nonce="Sh3xpq0pBQA=ccc43b898eccd1933fa63383d8a6447385119db9", uri="/proxypath/192.168.5.215/targetpath/myfile.jpg", algorithm=MD5, response="068f00e3460e4b585b4a90fa76be8b27", qop=auth, nc=00000003, cnonce="cbe75557a6107092"
请注意 Authorization 标头中的 uri 的差异。这当然是代理服务器的请求路径。(由于客户端处理身份验证,代理仅传递数据并重写 url)我怀疑问题就出在这里。(请注意,我无法直接在目标服务器上进行调试以验证这一点)
因此,问题是:在将授权传递给目标服务器之前,是否有办法动态重写授权?有没有办法让代理服务器处理身份验证,而不是仅仅从客户端传递身份验证?还是有其他/更好的方法?