存储用于离线身份验证的令牌
Posted
技术标签:
【中文标题】存储用于离线身份验证的令牌【英文标题】:Storing a token for offline authentication 【发布时间】:2018-02-17 05:38:15 【问题描述】:我正在开发一个要求用户登录才能使用它的应用程序。用户应该只有在连接到互联网时才能登录。当用户登录时,应在设备上存储一个令牌,允许离线使用应用程序而无需再次登录。我基本上想检查此令牌是否存在,如果存在则将用户带到应用程序或登录屏幕。此外,此令牌应在一段时间后过期。
问题是是否有一种存储令牌的方法,该令牌将在 24 小时后过期,而用户无法篡改它或以任何方式欺骗系统(例如,如果令牌带有时间戳并且用户更改设备时间)。令牌应该在用户没有连接到互联网的情况下过期,这样用户将无法永远使用该应用程序,而无需每隔一段时间重新验证一次。
虽然看起来很简单,但我一直无法找到这个问题的答案。我研究过 OAuth 和 NSHTTPCookie 等技术,但这些似乎与在线身份验证有关,而我试图在离线设置中对用户进行身份验证。
【问题讨论】:
可行但有一些问题。您是否要在连接到网络时使用存储的令牌在服务器上发送?您可以使用钥匙串保存凭据并在 Userdeafult 中保存上次登录时间(适合您。)。在下次登录之前,将上次登录时间与 24 小时进行比较。如果小于是,则允许访问,否则从钥匙串中删除凭据。 感谢您的回复。不,在令牌过期之前,我不会重新对服务器进行身份验证。已由服务器签名的令牌用于对用户进行 24 小时的身份验证和授权。即使用户可以访问互联网,如果存在有效令牌,我也不想连接到服务器。 非常适合钥匙串。最佳且安全。 为了强制执行时间戳,令牌可以是数字签名的 JWT,其中一个声明是到期时间。 JWT 使用私钥签名服务器端,使用公钥验证客户端。验证阶段包括对照时钟检查到期。假设用户没有篡改时钟或公钥,我认为应该可以工作。 这是我唯一担心的,用户篡改时钟。如果用户可以简单地设置时间来延长他们的会话,我认为这是一个巨大的安全漏洞。这是我从发布令牌的服务器获取时间的地方,但这需要用户连接到互联网。我希望 ios 有办法将令牌标记为已过期以避免这个问题。 【参考方案1】:您可以使用钥匙串,这是最安全的选择。
你可以使用“SwiftKeychainWrapper”
当用户进行身份验证时>>将令牌保存到钥匙串和时间戳。
let success: Bool = KeychainWrapper.standard.set("TOKEN", forKey: "authKey")
let success: Bool = KeychainWrapper.standard.set("TIMETAMP", forKey: "timeKey")
对于离线认证用户密钥和时间戳组合来检查是否给予用户访问权限...
let authToken: String? = KeychainWrapper.standard.string(forKey: "authKey")
let timeToken: String? = KeychainWrapper.standard.string(forKey: "timeKey")
时间到后,从钥匙串中移除...
【讨论】:
我应该将时间戳与什么进行比较?如果我将它与设备时间进行比较,用户不能简单地将时钟放回去以延长他们的会话吗?连接到服务器以获取时间不是一种选择。 是的,这很难解决,所以有很多关于这个的帖子......您可以考虑本地时间、服务器时间(用于第一次身份验证)、运营商时间、CPU 时间(系统重置时重置)重启)和操作系统通知......如果你发现一些有趣的东西,你可以阻止用户......问题是这个问题没有直接的解决方案......你可以参考下面的SO帖子***.com/questions/34627791/…***.com/questions/23801484/…以上是关于存储用于离线身份验证的令牌的主要内容,如果未能解决你的问题,请参考以下文章