2

我是使用 JWT 和 flask-jwt 的新手。我在我的项目中实现了 flash-jwt。即使我更改了用户密码,从 flask-jwt 收到的访问令牌也不会过期。那么如何防止使用旧的 flask-jwt 令牌。

4

3 回答 3

3

我们可以通过将所有令牌存储在我们的数据库中来构建一个额外的安全层。在验证令牌时,我们可以检查这个令牌是由我们的服务器本身生成的,还是不是使用这个数据库表生成的。我们也可以在用户重置密码时撤销该令牌,只需从 DB 中删除该令牌即可。

于 2015-12-09T06:23:28.110 回答
3

这是使用无状态 JWT 令牌的一个缺点 - 您不能显式撤销它们。

相应的优点是您不必联系外部服务来验证它们。

于 2015-11-30T15:01:16.313 回答
2

重要的是要记住,(无状态)JWT 令牌仅在它们过期或用于签名它们的共享密钥发生更改时才会失效。

所以基本上,选择是:

  • 正如@savad-kp 建议的那样,使用数据库来保留列入黑名单/撤销的令牌列表:这意味着您每次验证令牌时都必须查询它,这会破坏使用 JWT 令牌的主要好处之一。
  • 依赖短期访问令牌:这意味着客户端需要经常重新进行身份验证,这对于移动设备和 Web 应用程序来说可能是一个不可行的选择。
  • 使用令牌新鲜度模式或其他一些自定义变体:

[...] 您可以选择将一些访问令牌标记为新鲜,而另一些则标记为非新鲜,并使用fresh_jwt_required 装饰器仅允许新鲜令牌访问某些端点。

这对于允许新令牌做一些关键的事情(可能更改密码,或完成在线购买)很有用,但对非新令牌拒绝这些功能(直到他们重新验证并获得新的新令牌)。新鲜的令牌可以带来更安全的网站,而不会因为让用户一直重新进行身份验证而造成糟糕的用户体验。

我还建议使用flask-jwt-extended插件而不是flask-jwt插件。它支持一些开箱即用的常见模式(刷新令牌、令牌新鲜度)以及使用 db 的黑名单和令牌撤销。

于 2016-12-01T10:51:46.873 回答