所以我正在尝试实现以下方案:
app.com
proxy.com
因此,用户必须在同一请求中为代理和应用程序提供凭据,因此他具有不同的用户名/密码对:一对用于对应用程序进行身份验证,另一对用于验证自己的用户名/密码对代理。
阅读规范后,我不确定应该如何实现这一点。我想要做的是:
407 Proxy Authentication Required
并返回Proxy-Authenticate
标题,格式为:"Proxy-Authenticate: Basic realm="proxy.com"
。Proxy-Authenticate
标头重试请求,该标头是代理Proxy-Authorization
的Base64表示。username:password
标头回答。用户由代理进行身份验证,但不是由应用程序进行身份验证。该应用程序会在响应中添加401 Unauthorized
标头,例如WWW-Authenticate
。 问题:此标头值是否正确?WWW-Authenticate: Basic realm="app.com"
标头和使用应用Proxy-Authorization
的Base64表示值的Authorization
标头重试请求。整个工作流程是否正确?
答案 0 :(得分:28)
是的,对于您描述的情况来说,这看起来像是一个有效的工作流程,而且那些Authenticate标头看起来格式正确。
值得注意的是,尽管不太可能,但是给定连接可能涉及链接在一起的多个代理,并且每个代理本身都需要身份验证。在这种情况下,每个中间代理的客户端本身将返回407 Proxy Authentication Required
消息,并且自己使用Proxy-Authorization
标头重复请求; Proxy-Authenticate
和Proxy-Authorization
标头是单跳标头,不会从一台服务器传递到另一台服务器,但WWW-Authenticate
和Authorization
是端到端标头,被认为是从客户到最终服务器,由中介逐字传递。
由于Basic
方案以明文形式发送密码(base64是可逆编码),因此最常用于SSL。此方案以不同的方式实现,因为希望防止代理看到发送到最终服务器的密码:
CONNECT
request(仍带有Proxy-Authorization
标头)以打开TCP隧道远程服务器。Authorization
标头的最终HTTP消息。在这种情况下,代理只知道客户端连接到的主机和端口,而不知道通过内部SSL通道传输或接收的内容和端口。此外,使用嵌套通道允许客户端“看到”代理和服务器的SSL证书,允许对两者的身份进行身份验证。