2017-09-08 117 views
1

我正在研究一个需要用户登录才能使用它的应用程序。用户只能连接到互联网时才能登录。用户登录时,应在设备上存储令牌,允许在不登录的情况下脱机使用应用程序。我基本上想检查这个令牌是否存在,如果是,则将用户带到应用程序中,否则就是登录屏幕。此外,此令牌应在一段时间后过期。存储用于脱机身份验证的令牌

问题是,如果有一种方法可以存储令牌,例如24小时后,用户无法以任何方式篡改或诱骗系统(例如令牌为时间戳和用户更改设备时间)。令牌应在用户未连接到互联网的情况下过期,以便用户无法永久使用该应用程序,而无需每隔一段时间重新进行一次认证。

虽然看起来很简单,但我一直无法找到这个问题的答案。我研究过OAuth和NSHTTPCookie等技术,但这些看起来与在线身份验证有关,而我试图在脱机环境中对用户进行身份验证。

+0

可行的,但有一些题。您是否要使用存储的令牌在连接到网络时在服务器上发送?您可以使用钥匙串保存凭证并将上次登录时间保存在Userdeafult(适合您)。在下次登录之前,将上次登录时间与24小时进行比较。如果小于yes,则允许访问其他Keychain的删除凭证。 –

+0

谢谢你的回复。不,在令牌过期之前,我不会再与服务器进行身份验证。令牌由服务器签名,用于在24小时内对用户进行认证和授权。即使用户有互联网访问权限,如果存在有效的令牌,我也不想连接到服务器。 –

+0

非常适合钥匙扣。最佳&安全。 –

回答

0

您可以使用钥匙串,这将是最安全的选择。

你可以使用“SwiftKeychainWrapper”

当用户验证>>保存令牌钥匙圈和时间戳。

​​

离线验证用户密钥和时间戳组合,以检查是否给予用户访问...

let authToken: String? = KeychainWrapper.standard.string(forKey: "authKey") 
let timeToken: String? = KeychainWrapper.standard.string(forKey: "timeKey") 

后的时间到了刚刚从钥匙串删除...

+0

我应该如何比较时间戳?如果我将它与设备时间进行比较,用户是否可以简单地将时钟恢复到延长会话时间?连接到服务器以获得时间不是一种选择。 –

+0

是的,这很难解决,所以有很多这方面的帖子... 你可以让你自己的系统考虑当地时间,服务器时间(第一认证),运营商时间,CPU时间(系统重新启动时重置)和操作系统通知。 ...你可以阻止用户,如果你发现有趣的事情... 事情是没有直接的解决方案,这个问题.... 你可以参考下面SO帖子 https://stackoverflow.com/questions/34627791/accurate-time-detection-while-offline https://stackoverflow.com/questions/23801484/ios-time-change-notification - 和 - 前一时间的 – Abhishek

相关问题