Ios 如何检查每个需要登录的viewcontroller上的用户身份?

Ios 如何检查每个需要登录的viewcontroller上的用户身份?,ios,swift,session,authentication,Ios,Swift,Session,Authentication,好的……我有一个连接到PHP后端的swift应用程序。用户登录后,它会在服务器上存储一个会话,并在应用程序的cookieStorage中设置一个加密的cookie(我还将该cookie存储在keychain中,因为cookieStorage可能会因我被告知的内容而不稳定)。我还将用户名和密码存储在keychain中 服务器上的会话在一段时间未使用(比如30天)后过期,但如果用户返回,会话将在30天内自动续订。例如…假设我15天内不回来…我的会话现在重置为1天,还有30天到期…但是,如果我在第31

好的……我有一个连接到PHP后端的swift应用程序。用户登录后,它会在服务器上存储一个会话,并在应用程序的cookieStorage中设置一个加密的cookie(我还将该cookie存储在keychain中,因为cookieStorage可能会因我被告知的内容而不稳定)。我还将用户名和密码存储在keychain中

服务器上的会话在一段时间未使用(比如30天)后过期,但如果用户返回,会话将在30天内自动续订。例如…假设我15天内不回来…我的会话现在重置为1天,还有30天到期…但是,如果我在第31天回来,我必须重新登录web应用程序

此应用程序中有几个ViewController要求用户登录(有几个是UIWebView,它们使用cookie访问服务器上的数据……这些都不是问题,因为默认情况下它们像champ一样处理会话)。然而,要求用户登录的本机视图(tableview等)则是另一种情况

目前,在登录时,我在NSUserDefaults中设置了一个开关,即用户已登录…在didFinishLaunchingWithOptions中,我只是检查以确保用户已登录…如果他们已登录,我们将他们移动到应用程序的“专用”区域,如果他们未登录,我们将他们移动到登录屏幕(或注册屏幕)

所有这些都很好……但是随着会话在服务器上过期,我想知道在iOS应用程序中处理这个问题的合适方法是什么?我希望他们保持登录,直到他们选择其他方式,但如果应用程序保持关闭31天,服务器上的会话将不再有效。我想我可以在UserDefaults(上次打开应用程序)或类似的东西中设置一个日期,如果他们在30天内没有打开应用程序,那么我可以使用keychain中存储的用户名和密码将他们重新登录到PHP后端,刷新他们的会话并重置存储的登录日期(如果密码不再有效,我当然会重定向到登录视图)


在iOS应用程序中有没有更合适的方法来处理这个问题,或者这听起来像是一种有效的方法?日期/会话检查应该在
didfishlaunchingwithoptions
中,还是在
applicationIDbecomeactive
中?

首先,不要在
userDefaults
中存储与登录状态有关的任何内容,这不是问题不安全

第二,既然你将用户名和密码存储在钥匙链中,为什么不检查钥匙链并在用户每次打开应用程序时登录。这将为用户提供一个持久登录,直到他们注销为止,然后你可以清除钥匙链。这也将为你提供另一个分析点,你可以将其存储在数据库中,这样你就知道了每次用户打开你的应用程序时


您希望30天到期是有原因的吗?

如果用户更改了
NSUserDefaults
中的项目,这是否是一个安全问题?我想我不知道您的意思。如果您问这个问题是因为您认为这是现在正在发生的事情……不是。如果您问这个问题,是因为这与您的答案有关正在考虑…我很想听听。
NSUserDefaults
不安全,用户可以很容易地更改内容。只需清除数据库中停滞的会话就可以了。此外,我还认为检查存储的日期要比每次登录请求打服务器快得多…似乎只有在30天不活动后才进行检查就像不太密集的方式一样。你不同意吗?对DB的登录影响应该非常小。这种方法还允许你缩短服务器会话,以减少许多打开的非活动会话的开销。对DB的影响不是我的问题…应用程序对DB的请求,并导致用户必须等待那一瞬间(可能更长,具体取决于连接速度)我担心的是请求他们返回,以便他们能够开始移动。如果每次应用程序激活时都会发生这种情况,那么这可能会对数据库造成大量额外的点击。最终,这取决于您需要的安全性与可用性。在任何情况下,我都不会要求用户默认存储任何具有g与登录状态有关。