【问题标题】:iOS App - How to implement automatic session cookie refreshing using AFNetworking 2iOS App - 如何使用 AFNetworking 2 实现会话 cookie 自动刷新
【发布时间】:2014-06-16 13:19:57
【问题描述】:

我正在开发一个 iOS 应用程序(使用 AFNetworking 2、AFURLSessionManager),我必须在其中与我无法控制的 API 进行交互(如果这有什么不同,则使用 Symfony PHP 框架)。

问题是这样的:用户有一个帐户。在应用程序首次启动时,用户会获得一个基于表单的登录屏幕。他们登录,然后获得一个会话 cookie。 cookie 将在 30 分钟后过期。它会在客户端每次调用时更新自己。但是,如果重新启动应用程序,cookie 将被删除,如果应用程序空闲超过 30 分钟,cookie 将失效。

我在这里遇到了很多困难。首先,我需要透明地进行登录调用,因此用户不必重新登录。所以我收到错误响应并发出登录请求,成功后我重新发出原始请求。现在的问题是可能会同时发生多个请求,并将其与移动网络连接的不可靠特性相结合。因此,这种逻辑所发生的事情似乎是多次登录和重试以及大量额外代码和错误处理的噩梦。

到目前为止,我的解决方案是:提出请求。如果我收到未经授权的错误响应,请将请求添加到重试队列(我自己管理),设置登录标志,然后发出登录请求。任何新进来的请求首先检查登录标志,以查看是否正在进行登录。如果是这样,他们直接进入重试队列。登录请求完成后,我会通过重试队列并发出所有排队的请求。

到目前为止,这似乎运作良好。但是,我有一种挥之不去的感觉,那就是必须有更好的方法。是否没有内置机制来处理这种情况?这似乎是处理用户身份验证的常用方法,但我在 AFNetworking 中找不到有关如何处理此问题的任何文档。它们涵盖了 Basic 和 Digest 身份验证,但对这种基于表单的会话 cookie 身份验证一无所知。这是我第一次处理这个问题,我简直不敢相信没有其他人遇到过同样的问题。有什么想法吗?

【问题讨论】:

  • 这里有同样的问题/问题,我希望 AFNetworking 在运营经理或其他东西中有一种“重新登录”块。
  • 我会看看这个 Pratik 这似乎很有希望

标签: ios session authentication cookies afnetworking-2


【解决方案1】:

一旦用户登录,您的会话 ID 应该会自动发送,只要 cookie 在发送下一个请求之前没有过期。 AFNetworking 使用的 NSURLConnection 负责这是一种保存和加载 cookie 的方法,尝试像这样

 - (void)saveCookies{

    NSData *savecookiesData = [NSKeyedArchiver archivedDataWithRootObject: [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject: savecookiesData forKey: @"sessionCookies"];
    [defaults synchronize];

}

- (void)loadCookies{

    NSArray *loadcookiesarray = [NSKeyedUnarchiver unarchiveObjectWithData: [[NSUserDefaults standardUserDefaults] objectForKey: @"sessionCookies"]];
    NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];

    for (NSHTTPCookie *cookies in loadcookiesarray){
        [cookieStorage setCookie: cookies];
    }

}

【讨论】:

  • 这解决了我 50% 的问题,即在应用启动时保留 cookie。但是,会话在 30 分钟无通话后过期。因此,如果用户检查应用程序,离开,一小时后回来,无论如何我都必须重新进行身份验证。这种情况经常发生。我正在寻找的以及同时解决这两个问题的方法是某种回调,它会在我收到 401 时通知我并暂停请求队列,直到我完成重新登录操作。 Pratik 建议使用 AFNetworking-AutoRetry,它可能是最简单的解决方案。
猜你喜欢
  • 2019-03-12
  • 1970-01-01
  • 2020-08-11
  • 2016-02-09
  • 2016-05-06
  • 1970-01-01
  • 2020-12-12
  • 2019-04-28
  • 2023-03-19
相关资源
最近更新 更多