我已经阅读了https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication和 HTTP:权威指南中的“基本身份验证”一章。
我认为Proxy-Authenticate + Proxy-Authorization + status code 407
与WWW-Authenticate + Authorization + status code 401
基本相同。我认为如果服务器在两种情况下均响应WWW-Authenticate + 401
或Proxy-Authorization + 407
,浏览器将弹出一个身份验证对话框,然后浏览器将使用Authorization
或{{1 }}标头。
“ WWW-Authenticate组合头”按预期方式工作,而“代理组合头”则不起作用。对于Proxy-Authorization
,我在Chrome中得到Proxy-Authorization + 407
,而在Firefox中什么也没有发生(没有弹出验证对话框!)。
Chrome中的错误:
ERR_UNEXPECTED_PROXY_AUTH
那么这两套相似的标头之间有什么区别?我何时何地使用This site can’t be reached.
The webpage at http://localhost:5000/http_auth might be temporarily down or it may have moved permanently to a new web address.
ERR_UNEXPECTED_PROXY_AUTH
?我会运行的实用示例将不胜感激。
我正在使用带有Flask的Python进行测试。
我的服务器端代码:
WWW身份验证
Proxy-Authenticate
代理身份验证
@app.route('/www_auth')
def ha():
print("====request headers begin======")
print(request.headers)
print("====request headers end======")
if 'Authorization' in request.headers and request.headers['Authorization'] == 'Basic MTIzOjQ1Ng==':
return render_template('demo.html')
else:
resp = make_response(render_template('demo.html'), 401)
resp.headers['WWW-Authenticate'] = 'Basic realm="WWW-Authenticate required :)"'
return resp
答案 0 :(得分:0)
我做了一些测试,这是我发现的结果。 (我看了一下RFC,和往常一样,它实在太压倒性了:))
Proxy-Authenticate
标头集的确可以导致auth弹出对话框。但这是必须首先在客户端/浏览器中手动设置的内容。具体来说,例如在Firefox中,它与代理设置相关。
连接到需要用户名和密码的代理时,将使用Proxy-Authenticate
组标题。
注意:您需要像这样设置代理功能的根路径:
@app.route('/')
def haha():
#rest of the code
工作流程为:
-----------------------------------Step 1---------------------------------------------------->
client/browser <---Step 2, 407,Proxy-Authorization response header, required username and password----------- proxy
----Step 3, Proxy-Authorization request headers, contains credentials------------------------> --------> target website
----Subsequent requests, Proxy-Authorization request headers with credentials is still sent--> ---------> target website
在这种情况下,Proxy-Authorization
(带有凭据)将针对每个请求自动发送。
如果服务器不需要身份验证,则客户端可以直接访问目标网站,并且请求中没有Proxy-Authorization
标头。 (我认为您在网络上找到的大多数免费的HTTP代理都以这种方式工作)
在Firefox中设置代理设置时,我还尝试了WWW-Authenticate
组标题。结果是:每次访问新网站时,都需要再次进行身份验证。因此,显然WWW-Authenticate
标头集并不是在这种情况下使用的。
任何其他深入的意见/解释将不胜感激。毕竟我只是做了一些测试,我想知道更多。