【发布时间】:2013-05-01 03:08:21
【问题描述】:
我有一个通过 XMLRPC 连接到 Django 服务器的 iOS 应用程序(协议并不重要)。身份验证使用标准 cookie 进行持久化,并由AFNetworking 通过NSURLConnection 透明地处理。当请求未通过身份验证时,Django XMLRPC 库会返回 403 错误,并且当发生这种情况时,应用程序会向用户显示登录页面。这种方法已经运行了几年。
最近出现了一个问题,用户连接到 WiFi 热点但未通过热点进行身份验证。他们加载了应用程序并显示了登录页面,这一定是从热点返回的403 错误的结果。如果他们首先通过热点进行身份验证,那么一切正常。
我正在尝试找到一种解决方案,以防止我的应用将此类 403 错误解释为身份验证失败。我假设正在发生以下两种情况之一:
- 热点重定向到返回
403错误的URL;或 - 热点立即返回
403错误。
第一种情况很容易通过阻止 301 和 302 重定向来管理。幸运的是,AFNetworking 让这一切变得简单。
第二种情况更困难,我无法知道403 的来源。
有谁知道标头中是否还有其他内容可以检测403 的来源,或者是否存在在未登录热点时重定向请求的标准做法?
编辑
这是我的 Django 服务标头在 403 上的样子:
HTTP/1.1 403 FORBIDDEN
Server: nginx
Date: Sun, 28 Apr 2013 07:21:34 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 0
Connection: keep-alive
Vary: Cookie
Set-Cookie: sessionid=5a5ce154d1229e40c3773e8f6999a32d; expires=Sun, 18-Aug-2013 07:21:34 GMT; httponly; Max-Age=9676800; Path=/
【问题讨论】:
-
您可以记录返回的标头以查看可用的标头。您有权修改网络服务吗?
-
我很遗憾有问题的热点位于世界的另一端,所以我无法检查。我编辑了我的问题以显示我的网络服务的标题是什么样的......那里没有什么用处。
-
现在我想起来了...我可以创建一些中间件来添加一些东西到
HTTPRepsonse以识别响应的来源...看起来像一个黑客。 -
不是答案,但想知道如果需要身份验证,为什么服务器会发送 403(禁止)。 IMO,它应该是 401(未经授权)。 403 通常意味着,服务器在任何情况下都会拒绝响应,客户端应该放弃询问这些请求。
-
@CouchDeveloper 有效问题!它在我正在使用的 XMLRPC 库的实现中。如果出现任何问题,它被编程为返回 HttpResponseForbidden()。可能不正确...
标签: ios wifi nsurlconnection afnetworking http-status-code-403