http - HTTP规范:代理授权和授权标头

标签 http authentication basic-authentication specifications proxy-authentication

所以我试图实现以下场景:
应用程序受基本身份验证保护。假设它托管在app.com
应用程序前面的http代理也需要身份验证。主办时间proxy.com
因此,用户必须在同一请求中同时为代理和应用程序提供凭据,因此他有不同的用户名/密码对:一对用于针对应用程序进行身份验证,另一对用于针对代理进行身份验证。
在阅读了规范之后,我真的不知道该如何实现它。我想做的是:
用户在没有任何身份验证的情况下向代理发出http请求。
代理回答407 Proxy Authentication Required并返回格式为:Proxy-Authenticate"Proxy-Authenticate: Basic realm="proxy.com"头。问题:是否正确设置了此Proxy-Authenticate头?
然后,客户端使用Proxy-Authorization头重试请求,该头是代理username:password的base64表示。
这次代理验证请求,但是应用程序用401 Unauthorized报头应答。用户已通过代理验证,但未通过应用程序验证。应用程序将WWW-Authenticate头添加到响应中,如WWW-Authenticate: Basic realm="app.com"。问题:此标题值正确对吗?
客户端再次使用Proxy-Authorization头和Authorization头重试请求,这两个头的值都是应用程序username:password的base64表示形式。
此时,代理成功地对请求进行身份验证,并将请求转发给对用户进行身份验证的应用程序。客户最终得到了回复。
整个工作流程是否正确?

最佳答案

是的,对于您描述的情况,这看起来是一个有效的工作流,并且那些身份验证头的格式似乎正确。
值得注意的是,对于给定的连接,涉及多个链接在一起的代理是可能的,尽管不太可能,而每个连接本身都需要认证。在这种情况下,每个中间代理的客户端本身将返回一条407 Proxy Authentication Required消息,并用Proxy-Authorization头重复请求;Proxy-Authenticate头和Proxy-Authorization头是单跳头,不会从一个服务器传递到下一个服务器,但是WWW-AuthenticateAuthorization是端到端的报头,它们被认为是从客户端到最终服务器的报头,由中介逐字传递。
由于Basic方案以明文形式发送密码(base64是可逆编码),因此它最常用于ssl。此方案以不同的方式实现,因为希望防止代理看到发送到最终服务器的密码:
客户端打开到代理的ssl通道来启动请求,但它将提交a special CONNECT request(仍然带有Proxy-Authorization头)而不是提交常规http请求,以打开到远程服务器的tcp隧道。
然后,客户机继续创建嵌套在第一个ssl通道中的另一个ssl通道,通过该通道传输包括Authorization头的最终http消息。
在这种情况下,代理只知道客户端连接到的主机和端口,而不知道通过内部ssl通道传输或接收的内容。此外,使用嵌套通道允许客户机“查看”代理和服务器的SSL证书,从而允许对两者的身份进行身份验证。

本文翻译自 https://stackoverflow.com/questions/10023636/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。


相关文章:

https - HTTPS和BASIC身份验证

java - 从使用我的Java代码使用基本http身份验证的服务器下载文件时出现问题

perl - 如何在Perl中构建和解析HTTP URL / URI /路径?

http - 将Api.ai连接到节点红色

android - Android使用HTTP多部分表单数据将视频上传到远程服务器

java - 通过GWT客户端进行YouTube身份验证

ruby-on-rails - 如何在Rails 5控制器测试中测试或绕过Basic Auth

http - 用Selenium检查HTTP响应标头的最佳方法

tomcat - 使用tomcat进行基于表单的身份验证

php - 移动应用程序开发 - 如何创建服务器实现