代理验证和WWW验证有什么区别?

时间:2019-09-05 05:05:23

标签: http http-authentication

我已经阅读了https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication HTTP:权威指南中的“基本身份验证”一章。

我认为Proxy-Authenticate + Proxy-Authorization + status code 407WWW-Authenticate + Authorization + status code 401基本相同。我认为如果服务器在两种情况下均响应WWW-Authenticate + 401Proxy-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

1 个答案:

答案 0 :(得分:0)

我做了一些测试,这是我发现的结果。 (我看了一下RFC,和往常一样,它实在太压倒性了:))

Proxy-Authenticate标头集的确可以导致auth弹出对话框。但这是必须首先在客户端/浏览器中手动设置的内容。具体来说,例如在Firefox中,它与代理设置相关。

enter image description here

连接到需要用户名和密码的代理时,将使用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标头集并不是在这种情况下使用的。


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