gpt4 book ai didi

http - Proxy-Authenticate 和 WWW-Authenticate 之间有什么区别?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:21:15 26 4
gpt4 key购买 nike

我读过 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,在这两种情况下,浏览器都会弹出一个授权对话框,然后浏览器会使用 AuthorizationProxy-Authorization header 发送凭据。

“WWW-Authenticate combination headers”确实按预期工作,而“Proxy combination headers”却没有。对于 Proxy-Authorization + 407,我在 Chrome 中得到了 ERR_UNEXPECTED_PROXY_AUTH,但在 Firefox 中没有任何反应(没有弹出身份验证对话框!)。

Chrome 中的错误:

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

那么这两组相似的标题有什么区别呢?我何时何地使用 Proxy-Authenticate?非常感谢我可以运行的实际示例。


我正在使用 Python 和 Flask 进行测试。

我的服务器端代码:

WWW-认证

@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

代理验证

@app.route('/proxy_auth')
def haha():
print("====request headers begin======")
print(request.headers)
print("====request headers end======")
if 'Proxy-Authorization' in request.headers and request.headers['Proxy-Authorization'] == 'Basic MTIzOjQ1Ng==':
return render_template('demo.html')
else:
resp = make_response(render_template('demo.html'), 407)
resp.headers['Proxy-Authenticate'] = 'Basic realm="Proxy-Authenticate required :)"'
return resp

最佳答案

我做了一些测试,下面是我的发现。 (我看了一下 RFC,和往常一样,它太让人不知所措了 :) )

Proxy-Authenticate header 集确实也可以导致身份验证弹出对话框。但这是一开始必须在客户端/浏览器中手动设置的东西。具体来说,例如在Firefox中,它与代理设置有关。

enter image description here

Proxy-Authenticate header 集在您连接到需要用户名和密码的代理时使用。

注意:您需要像这样设置代理函数的根路径:

@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头。 (我认为您在 Web 上找到的大多数免费 http 代理都是以这种方式工作的)


在 Firefox 中设置代理设置时,我还尝试了 WWW-Authenticate header 集。结果就是:每次访问一个新的网站,我都需要重新认证。所以很明显,WWW-Authenticate header 集不适用于这种情况。


任何其他深入的意见/解释将不胜感激。毕竟我只是做了一些测试,我想知道更多。

关于http - Proxy-Authenticate 和 WWW-Authenticate 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57798725/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com