在客户端(iOS 和 Android)和服务器之间使用以下无状态授权机制是否安全?
注册
客户端提供电子邮件和密码,并将明文密码保存在iOS 上
Keychain,并使用Android的一些替代方案。如果认为用户在 DB 上创建的足够强,服务器会检查密码强度。
服务器生成 a
JWT token并将其返回给客户端。令牌的过期时间为 15 分钟。客户端存储令牌(可能在
Keychain自身上)并将其包含在标头上的每个后续请求中Authorization。对于每个请求,服务器都会检查提供的令牌(检查签名和过期时间)。如果正常则处理请求,否则
HTTP 401返回 an。
登入
当客户端收到
HTTP 401来自服务器的信息时,这意味着需要登录。因此应用程序访问Keychain并获取电子邮件和密码并将其发送到服务器(无需用户干预)。服务器验证提供的凭据,如果它们有效,它将重复从 3 到 5的注册步骤。
由于令牌的到期时间,如果令牌被泄露,它将在短时间内有效。
如果用户在多台设备上登录并且她从一台设备更改了密码,则其他设备将仅在短时间内保持登录状态,但存储在该设备上的清除密码Keychain将不再有效。所以需要一个新的手动登录,我认为这很好。
你看到了哪些缺点?
我一直在考虑使用刷新令牌程序来避免存储清除密码,但这增加了复杂性和其他缺点(例如:如何保证refresh token只使用一次)。据我所知,将明文密码存储在上面KeyChain是足够安全的:
但我也看到了其他不建议在设备上存储密码的问题。
所以我想听听其他人对此的看法。