【发布时间】:2018-02-17 05:38:15
【问题描述】:
我正在开发一个要求用户登录才能使用它的应用程序。用户应该只有在连接到互联网时才能登录。当用户登录时,应在设备上存储一个令牌,允许离线使用应用程序而无需再次登录。我基本上想检查此令牌是否存在,如果存在则将用户带到应用程序或登录屏幕。此外,此令牌应在一段时间后过期。
问题是是否有一种存储令牌的方法,该令牌将在 24 小时后过期,而用户无法篡改它或以任何方式欺骗系统(例如,如果令牌带有时间戳并且用户更改设备时间)。令牌应该在用户没有连接到互联网的情况下过期,这样用户将无法永远使用该应用程序,而无需每隔一段时间重新验证一次。
虽然看起来很简单,但我一直无法找到这个问题的答案。我研究过 OAuth 和 NSHTTPCookie 等技术,但这些似乎与在线身份验证有关,而我试图在离线设置中对用户进行身份验证。
【问题讨论】:
-
可行但有一些问题。您是否要在连接到网络时使用存储的令牌在服务器上发送?您可以使用钥匙串保存凭据并在 Userdeafult 中保存上次登录时间(适合您。)。在下次登录之前,将上次登录时间与 24 小时进行比较。如果小于是,则允许访问,否则从钥匙串中删除凭据。
-
感谢您的回复。不,在令牌过期之前,我不会重新对服务器进行身份验证。已由服务器签名的令牌用于对用户进行 24 小时的身份验证和授权。即使用户可以访问互联网,如果存在有效令牌,我也不想连接到服务器。
-
非常适合钥匙串。最佳且安全。
-
为了强制执行时间戳,令牌可以是数字签名的 JWT,其中一个声明是到期时间。 JWT 使用私钥签名服务器端,使用公钥验证客户端。验证阶段包括对照时钟检查到期。假设用户没有篡改时钟或公钥,我认为应该可以工作。
-
这是我唯一担心的,用户篡改时钟。如果用户可以简单地设置时间来延长他们的会话,我认为这是一个巨大的安全漏洞。这是我从发布令牌的服务器获取时间的地方,但这需要用户连接到互联网。我希望 iOS 有办法将令牌标记为已过期以避免这个问题。
标签: ios security authentication storage