Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
HTTP规范:代理授权和授权头_Http_Authentication_Basic Authentication_Specifications_Proxy Authentication - Fatal编程技术网

HTTP规范:代理授权和授权头

HTTP规范:代理授权和授权头,http,authentication,basic-authentication,specifications,proxy-authentication,Http,Authentication,Basic Authentication,Specifications,Proxy Authentication,因此,我尝试实现以下场景: 应用程序受基本身份验证的保护。假设它是托管在app.com 应用程序前面的HTTP代理也需要身份验证。它位于proxy.com 因此,用户必须在同一请求中为代理和应用程序提供凭据,因此他有不同的用户名/密码对:一对用于根据应用程序对自己进行身份验证,另一对用于根据代理对自己进行身份验证 在阅读了规范之后,我真的不确定应该如何实现这一点。我想做的是: 用户在没有任何身份验证的情况下向代理发出HTTP请求 代理回答407需要代理身份验证,并返回代理身份验证标题,格式为

因此,我尝试实现以下场景:

  • 应用程序受基本身份验证的保护。假设它是托管在
    app.com
  • 应用程序前面的HTTP代理也需要身份验证。它位于
    proxy.com
因此,用户必须在同一请求中为代理和应用程序提供凭据,因此他有不同的用户名/密码对:一对用于根据应用程序对自己进行身份验证,另一对用于根据代理对自己进行身份验证

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

  • 用户在没有任何身份验证的情况下向代理发出HTTP请求
  • 代理回答
    407需要代理身份验证
    ,并返回
    代理身份验证
    标题,格式为:
    “代理身份验证:Basic realm=“proxy.com”

    问题:此
    代理身份验证
    标题设置是否正确
  • 然后,客户端使用
    代理授权
    头重试请求,该头是代理的Base64表示形式
    用户名:密码
  • 这一次,代理对请求进行身份验证,但随后应用程序使用
    401 Unauthorized
    头进行响应。用户由代理进行身份验证,但未由应用程序进行身份验证。应用程序向响应添加
    WWW Authenticate
    头,如
    WWW Authenticate:Basic realm=“app.com”“
    问题:此标题值是否正确
  • 客户端使用
    代理授权
    标头和
    授权
    标头(应用程序的
    用户名:密码
    的Base64表示形式)重试请求
  • 此时,代理成功地对请求进行身份验证,并将请求转发给对用户进行身份验证的应用程序。客户端最终得到了响应

  • 整个工作流程是否正确?

    是的,对于您描述的情况,这看起来是一个有效的工作流程,并且这些身份验证标头的格式似乎正确

    值得注意的是,一个给定的连接可能(尽管可能性不大)涉及多个链接在一起的代理,并且每个代理本身都可能需要身份验证。在这种情况下,每个中间代理的客户端自身将返回
    407所需代理身份验证
    消息,并自身使用
    代理授权
    头重复请求;
    Proxy Authenticate
    Proxy authentication
    头是单跳头,不能从一台服务器传递到下一台服务器,但是
    WWW Authenticate
    authentication
    是端到端头,被认为是从客户端到最终服务器的头,由中间人逐字逐句地传递

    由于
    Basic
    方案以明文形式发送密码(base64是可逆编码),因此它最常用于SSL。此场景以不同的方式实现,因为需要防止代理看到发送到最终服务器的密码:

    • 客户端打开到代理的SSL通道以启动请求,但它不会提交常规HTTP请求(仍带有
      代理授权
      头)以打开到远程服务器的TCP隧道
    • 然后,客户端继续创建嵌套在第一个SSL通道内的另一个SSL通道,通过该通道传输最终HTTP消息,包括
      授权

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

    好的,感谢这里解释了proxy-*头,我们正在寻找它们。但是你解决了你的问题吗?为什么这个问题仍然悬而未决?因为您刚刚要求对该方法进行一般验证,所以我尝试在我的回答中围绕此设置的其他排列添加一些额外的颜色。然而,如果你问这个问题是因为你尝试了你所描述的并且遇到了一个特定的错误,请更新这个问题以包含这个错误;虽然我尽了最大努力验证您发布的内容,但真正的测试只是尝试一下,看看会发生什么。我知道我正在从您那里恢复这一领域的知识(2年前),但是您知道大多数现代浏览器是否通过SSL发送代理基本身份验证吗?我不确定我是否理解这个问题,但是:浏览器将在发送请求时通过相同的通道发送基本身份验证凭据,因此,如果代理URL为https:,则它将位于SSL通道中,但如果代理URL仅为http:,则它将处于清除状态。(如果我不理解你的问题,最好开始一个新的顶级问题,而不是在这里进一步解释。问题中有更多细节的空间,而不是评论。)