JWT用于无状态API,但用于安全性的会话控制

时间:2015-12-18 12:30:20

标签: rest security jwt

我真的想使用JWT进行API访问,以保持无状态。但与此同时,我需要有强大的安全手段来拒绝尚未到期的令牌。

对于更敏感的用户信息API,我可以依赖强制重新登录,比较IP地址等。但我仍然希望能够在需要时撤消用户令牌。我不介意支付间接费用。

我想象的是让每个用户根据他们的密码创建自己的密钥,并将其存储在会话中。我不介意交易开销,以便更轻松地处理被盗令牌。这样,简单的密码重置就会使旧令牌无效。

承认这种权衡,这种方法有意义吗?有没有更好的方法来解决这个问题?

4 个答案:

答案 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)

好吧,我刚才有同样的实现方式。将哈希密码添加到令牌,当客户端返回令牌时,在验证期间,检查用户的密码是否已在db中更改,如果用户的哈希传递与您在令牌中放入的密码不同,拒绝令牌。这样,您就不需要在服务器上保留有关用户和/或令牌的任何信息。

答案 2 :(得分:0)

我不喜欢白/黑列出令牌的想法,因此我最终使用用户哈希密码+另一个随机密钥作为其令牌的密钥:

+---------------+------------------------------------+-----------+
|     email     |              password              |    key    |
+---------------+------------------------------------+-----------+
| user@mail.com | asfsifj2fij4f4f4f8d9dfhs.8f8fhsd8h | r4nd0Mk3Y |
+---------------+------------------------------------+-----------+

然后我在用户id=>password+key的内存中保留一个缓存来验证每个用户令牌。这种方式令牌可以在以下情况下丢弃:1)用户重置密码; 2)应用程序更改用户key

这几乎打败了JWT的目的,但我的用例需要这层安全。

答案 3 :(得分:0)

JSON Web令牌

JSON Web令牌(JWT)由RFC 7519定义。

它是在双方之间安全地代表索赔的标准方法。 JWT是一个独立的令牌,使您能够在有效负载中存储用户标识符,到期日期和任何您想要的内容(但不要存储密码),这是{{3编码为JSON

客户端可以读取有效负载,并且可以通过验证服务器上的签名来轻松检查令牌的完整性。

跟踪您的令牌

如果您不需要跟踪JWT令牌,则无需持久保存JWT令牌。

尽管如此,通过持久存在令牌,您将有可能使其无效并撤销其访问权限。要保持跟踪JWT令牌,而不是保留整个令牌,您可以保留令牌标识符(Base64声明)和一些元数据(您发出令牌的用户,到期日期等),如果您需要。

您的应用程序可以提供一些撤消令牌的功能,但在用户更改密码时始终考虑撤消令牌。

持久令牌时,请始终考虑删除旧令牌,以防止数据库无限期增长。

其他信息

通过网络发送敏感数据时,您最好的朋友是HTTPS,它可以保护您的应用免受jti的攻击。<​​/ p>

要找到一些与JWT合作的优秀资源,请查看man-in-the-middle attack