【问题标题】:How to handle correctly HTTP Digest Authentication on iPhone如何在 iPhone 上正确处理 HTTP Digest 身份验证
【发布时间】:2010-05-13 13:46:36
【问题描述】:

我正在尝试将文件上传到我的个人服务器。

我已经编写了一个小 php 页面,到目前为止运行良好。

有点奇怪的是,我生成了要发送的 HTTP 消息的所有正文(假设大约 4 mb),然后我将请求发送到我的服务器。

然后,服务器请求 HTTP 质询,我的委托连接:didReceiveAuthenticationChallenge:challenge 使用正确的凭据和数据回复服务器。

但是,发生了什么事?数据已发送两次!

事实上,我注意到当我添加进度条时.. 应用程序发送数据(4mb),服务器要求身份验证,应用程序重新发送具有身份验证的数据(另外 4mb)。所以,最后,我发送了 8mb。错了。

我开始在谷歌上搜索并寻找解决方案,但我不知道如何解决这个问题。

案例场景有两种(我的猜测):

  • 共享整个会话的领域(一个最小的 HTTP 请求,然后是质询,然后是数据)
  • 使用同步方式执行 HTTP 连接(我不想这样做,因为在我看来处理这类事情的方式很丑陋)

谢谢

【问题讨论】:

    标签: iphone http sdk connection digest


    【解决方案1】:

    您在 http 协议中遇到了一个缺陷:您必须先发送所有数据,然后才能获得带有身份验证挑战的响应(当您发送没有凭据的请求时)。您可以尝试在同一会话中作为第一个请求进行一次小型往返(如您所提到的),例如 HEAD 请求,然后以后的请求将共享相同的随机数。

    【讨论】:

    • 有没有办法使用 iPhone SDK 提供的 NS 东西来做到这一点?我设法使用 ASIHTTPRequest 实现了目标,并进行了两个连接(第一个是同步的,使用用户名和密码),第二个是异步的,只填充了数据。这只是一个好奇的问题,但我想深入研究一下。
    • 你能不使用 NSUrlConnection 吗?如果没有,您可能会直接使用 CFNetwork,或者(正如您已经使用过的)ASIHttpRequest。 (我不是 iPhone 程序员,所以我根据我的 Mac 经验给你建议,尽管它已经很老了。)
    • 我设法使用 ASIHTTPRequest 解决了这个问题。我第一次使用带有凭据的同步请求(并创建了一个会话)。如果第一个连接成功,我打开的第二个连接已经过身份验证。 :)
    【解决方案2】:

    回复原始请求者为时已晚,但如果其他人看到此内容,及时。

    TL;DR:Section 8.2.3 of RFC 2616 描述了 100 Continue 状态,这是您在这种情况下所需要(需要)的全部。 另请参阅第 10.1.1 和 14.20 节。

    客户端发送带有“Expect: 100-continue”标头的请求,在发送正文之前暂停请求。服务器使用已经接收到的标头来决定是否可以接受此请求(如果要接收的实体 - 主体 - 不是太大,如果用户的凭据是正确的......)。如果服务器可以接受请求,它会回复“100 Continue”状态码,客户端发送正文,服务器会回复该请求的最终状态码。相反,如果请求不可接受,服务器会回复 4xx 状态代码(“413 Request Entity Too Large”,如果提供的正文大小...太大,或者“401 Unauthorized”+ WWW-Authenticate : header) 并且客户端不发送正文。收到 401 状态代码和相应的 WWW-Authenticate: 信息后,客户端现在可以再次执行请求并提供其凭据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-29
      • 2013-06-11
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 2011-06-20
      • 2015-06-11
      相关资源
      最近更新 更多