38

所以我想实现以下情景:HTTP规格:代理授权和授权头

  • 的申请是由基本身份验证保护。假设它位于app.com
  • 在应用程序前面的HTTP代理也需要身份验证。它是在proxy.com

托管因此,用户必须提供代理,并在同一个请求的应用既证书,他也因此有不同的用户名/密码对:一对,以验证自己对应用程序,而另一个用户名/密码对,以对代理进行身份验证。

阅读规范后,我不太确定我应该如何实现这一点。我想要做的是:

  1. 用户向代理发出HTTP请求,而不进行任何类型的身份验证。
  2. 代理回答407 Proxy Authentication Required,并返回Proxy-Authenticate标题,格式为:"Proxy-Authenticate: Basic realm="proxy.com"
    问题:这Proxy-Authenticate标题设置正确吗?
  3. 客户端然后用Proxy-Authorization标题重试请求,即代理username:password的Base64表示。
  4. 这次代理验证请求,但应用程序使用401 Unauthorized标题进行回答。用户由代理进行了身份验证,但不是由应用程序进行身份验证。该应用程序将一个WWW-Authenticate标题添加到响应中,如WWW-Authenticate: Basic realm="app.com"问题:此标题值是否正确?
  5. 客户端再次尝试使用Proxy-Authorization标头和Authorization标头,并使用应用程序的username:password的Base64表示值重新发送请求。
  6. 此时,代理成功验证请求,并将请求转发给验证用户的应用程序。客户终于得到回应。

整个工作流程是否正确?

+0

嗯,感谢您在这里解释的Proxy- *标题,正在寻找它们。但是你解决了你的问题吗?为什么问题仍然存在? – 2013-02-03 16:51:35

+0

由于您只是要求对方法进行一般验证,所以我试着在我的答案中添加一些其他颜色,以便对此设置的其他排列方式进行说明。但是,如果因为您尝试了所描述的内容并遇到特定错误而提出此问题,请更新问题以包含该错误;尽管我尽了最大努力来验证您发布的内容,但真正的测试只是简单地尝试一下,看看会发生什么。 – 2013-03-22 03:58:31

回答

25

是的,这看起来像您描述的情况的有效工作流程,并且这些验证标头似乎是正确的格式。

有趣的是,尽管不太可能,给定的连接可能涉及多个连接在一起的代理,并且每个代理本身都可能需要身份验证。在这种情况下,每个中间代理的客户端将自己获得一个407 Proxy Authentication Required消息,并且自己用Proxy-Authorization头重复该请求; Proxy-AuthenticateProxy-Authorization标头是单跳标头,不会从一台服务器传递到下一台服务器,但WWW-AuthenticateAuthorization是端到端标头,被认为是从客户端到最终服务器的端到端标头,通过逐字传递中介。

由于Basic方案在明文中发送密码(base64是一种可逆编码),因此它最常用于SSL。这种情况是以不同的方式实现的,因为希望防止代理看到发送到最终服务器的密码:

  • 客户端打开一个到代理的SSL通道来发起请求,而不是提交一个普通的HTTP请求,它会提交a special CONNECT request(仍然带有一个Proxy-Authorization头)来打开到远程服务器的TCP隧道。
  • 然后客户端继续创建另一个 SSL通道嵌套在第一个SSL通道中,通过它传输最终的HTTP消息,包括Authorization标头。

在这种情况下,代理只知道客户端连接到的主机和端口,而不知道通过内部SSL通道发送或接收的内容。此外,使用嵌套通道允许客户端“查看”代理服务器和服务器的SSL证书,从而允许两者的身份验证。

+0

我知道我正在从这个领域恢复知识领域(2年前),但是你知道大多数现代浏览器是否通过SSL发送代理基本认证? – Zerkz 2015-07-22 23:40:12

+2

我不确定我是否理解这个问题,但是:浏览器将在发送请求时通过同一通道发送基本认证凭证,因此如果您的代理URL是https:那么它将位于SSL通道中,但是如果你的代理网址只是http:那么它将是明确的。 – 2015-07-23 06:37:46

+1

(如果我不理解你的问题,最好是开始一个新的顶级问题,而不是试图在这里进一步解释。在一个问题中有更多的细节而不是评论。) – 2015-07-23 06:38:22