保持用户登录(重试HTTP请求)

时间:2014-07-17 19:27:35

标签: ios objective-c cocoa-touch ios7 afnetworking-2

所以基本上我想要实现的是让用户始终登录并且不要用手动填写用户名和密码来打扰他。当然,首次登录是必要的,但随后我将凭证存储在Keychain中以及何时需要(例如服务器提供的令牌到期)我想自动获取这些凭据,重新登录用户和重试上次请求,以便用户获得良好的体验。

NSScreencast对这个问题有一个非常流畅的解决方案。并且它符合我的需求但是......我想使用AFHTTPSessionManager代替AFHTTPRequestOperation。如果您曾使用 AFNetworking 2 AFHTTPSessionManager方法,则NSURLSessionDataTask会在success:failure:块中返回AFHTTPRequestOperation AFHTTPRequestOperation因此很容易重复使用它。


我的工作流程如下所示:

我向服务器发送了一个请求,我得到了我正在处理的响应...当请求成功时,我得到了responseObject并做了我想要的任何事情,但是当我收到错误时我检查它是否是401,如果是,我想调用retryLogin方法(重要!此方法只能执行一次),我必须将请求传递给它。在这个方法中,我检查我是否在Keychain中存储了凭据,如果是,我调用我传递此请求的授权方法,如果授权失败,我向用户显示LoginViewController的视图以输入新的凭据。


它看起来像小菜一碟但问题是如何只调用retryLogin一次,更重要的是 - 如何从NSURLSessionDataTask获取请求?我想要这个应用程序使用iOS 7方法,所以它是NSURLSession,以防旧方法被弃用。

1 个答案:

答案 0 :(得分:1)

我的印象是您的问题来自当前的解决方案架构,所以我建议您更改它。

在您描述的工作流程中,存在严重的安全问题:应用程序将在设备上存储用户凭据。这在前十名移动OWASP(https://www.owasp.org/index.php/Mobile_Top_10_2014-M5)中属于M5。即使这些数据存储在Keychain中,根据OWASP Top 10 M1(https://www.owasp.org/index.php/Mobile_Top_10_2014-M2)仍然不能被认为是安全的。

对于用户身份验证,我建议不要存储用户凭据:在LoginViewController上,为OAuth2访问令牌交换用户+密码对,这对于设备是唯一的,并且可以在服务器端随时无效。在这种情况下,用户应该被重定向到登录屏幕,而不会重复请求问题。

相关问题