2014-07-17 33 views
1

所以基本上我想实现的目的是保持用户始终登录,不用打扰用户手动填写用户名和密码。当然,有必要在第一时间登录,然后我将凭证存储在钥匙串中,并在需要时(例如,从服务器给出的令牌到期),我想要自动获取这些凭证,重新登录用户并重试上次请求,以便用户获得很棒的经验。保持用户登录(重试HTTP请求)

NSScreencast上有这个漂亮的光滑的结构来解决这个问题。它适合我的需求,但...我想使用AFHTTPSessionManager而不是AFHTTPRequestOperation。如果您曾与AFNetworking 2AFHTTPSessionManager方法返回NSURLSessionDataTasksuccess:failure:块当AFHTTPRequestOperation返回AFHTTPRequestOperation因此很容易重用它。


我的工作流程是这样的:

我向服务器发送一个请求,我得到我处理propely响应......当请求succeds我得到responseObject,做任何我想要它,但是当我收到错误时,我检查它是否是401,如果是,我想调用retryLogin方法(重要!此方法只能执行一次,我必须通过该请求)。在这个方法里面,我检查我是否有存储在Keychain中的证书,如果是,我调用我通过这个请求的授权方法,如果授权失败,我向用户显示LoginViewController的视图以输入新的证书。


它看起来像一块蛋糕,但问题是如何更重要的是呼吁retryLogin只有一次, - 如何获得从NSURLSessionDataTask的要求?我想要这个应用程序使用iOS 7的方法,所以它是NSURLSession,以防万一旧的方法被弃用。

回答

1

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

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

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

+0

我知道存在一些安全问题,但是...这是因为糟糕的API设计。但我真的很感谢你的贡献。这是一个投票来说服我的服务器开发人员实现OAuth2! – cojoj

+0

如果您确实需要,我会抽象为第二个登录请求提供所需信息给某个对象,并用它来构建新的请求并执行。 –