我真的想使用JWT进行API访问,以保持无状态。但与此同时,我需要有强大的安全手段来拒绝尚未到期的令牌。
对于更敏感的用户信息API,我可以依赖强制重新登录,比较IP地址等。但我仍然希望能够在需要时撤消用户令牌。我不介意支付间接费用。
我想象的是让每个用户根据他们的密码创建自己的密钥,并将其存储在会话中。我不介意交易开销,以便更轻松地处理被盗令牌。这样,简单的密码重置就会使旧令牌无效。
承认这种权衡,这种方法有意义吗?有没有更好的方法来解决这个问题?
答案 0 :(得分:2)
您应该在服务器上创建“黑名单”。如果需要撤销令牌,请将其置于黑名单中,并在令牌过期时将其设置为从列表中过期。对于每次身份验证尝试,您将验证传入的JWT不在黑名单中。 Redis可以让这很容易。
或者,考虑第三方服务,例如Stormpath。免责声明:我为Stormpath工作。我们有一个Oauth2 api,让你发出访问+刷新令牌(用于密码授权流程)。我们为您处理撤销,只要您不介意REST调用的开销来验证令牌的状态。请参阅Using Stormpath for OAuth 2.0 and Access/Refresh Token Management。我们在Express-Stormpath .library
中可以轻松支持此功能答案 1 :(得分:0)
答案 2 :(得分:0)
我不喜欢白/黑列出令牌的想法,因此我最终使用用户哈希密码+另一个随机密钥作为其令牌的密钥:
+---------------+------------------------------------+-----------+
| email | password | key |
+---------------+------------------------------------+-----------+
| user@mail.com | asfsifj2fij4f4f4f8d9dfhs.8f8fhsd8h | r4nd0Mk3Y |
+---------------+------------------------------------+-----------+
然后我在用户id=>password+key
的内存中保留一个缓存来验证每个用户令牌。这种方式令牌可以在以下情况下丢弃:1)用户重置密码; 2)应用程序更改用户key
。
这几乎打败了JWT的目的,但我的用例需要这层安全。
答案 3 :(得分:0)
JSON Web令牌(JWT)由RFC 7519定义。
它是在双方之间安全地代表索赔的标准方法。 JWT是一个独立的令牌,使您能够在有效负载中存储用户标识符,到期日期和任何您想要的内容(但不要存储密码),这是{{3编码为JSON。
客户端可以读取有效负载,并且可以通过验证服务器上的签名来轻松检查令牌的完整性。
如果您不需要跟踪JWT令牌,则无需持久保存JWT令牌。
尽管如此,通过持久存在令牌,您将有可能使其无效并撤销其访问权限。要保持跟踪JWT令牌,而不是保留整个令牌,您可以保留令牌标识符(Base64声明)和一些元数据(您发出令牌的用户,到期日期等),如果您需要。
您的应用程序可以提供一些撤消令牌的功能,但在用户更改密码时始终考虑撤消令牌。
持久令牌时,请始终考虑删除旧令牌,以防止数据库无限期增长。
通过网络发送敏感数据时,您最好的朋友是HTTPS,它可以保护您的应用免受jti
的攻击。</ p>
要找到一些与JWT合作的优秀资源,请查看man-in-the-middle attack。