jsonwebtoken 存储在服务器 nodejs 中的位置。用户注销后如何使 JWT 过期

Anu*_*tam 4 node.js jwt express-jwt json-web-token

我在客户端的会话/本地存储上存储令牌。我面临的问题是,一旦用户复制该令牌并将其用于其他已登录的会话服务,它就可以工作,但它应该在 JWT.varify 上返回无效令牌。

Blacklist/Delete/Expire一旦用户注销,有没有办法获取当前使用的令牌?

小智 6

有几种方法可以为此目的设置黑名单:

1)(数据库中的黑名单用户)为用户添加一个数据库列isTokenExpired,登录成功时设置为false,想要使token过期时设置为true(例如用户修改密码、注销等)时间已过)。

上面的方法会达到你的目的,但是我觉得这是对编程的侮辱。我假设您使用的是 JWT,因此用户不必每次都登录,并且您只有 1 台服务器进行身份验证和所有其他服务器功能。尽管 JWT 不是为“会话”而设计的,但为此目的使用 JWT 可以减轻数据库的负载。但是,如果您随后在每个用户操作上设置和检查另一个数据库标志,您将再次添加该负载,并且您仍然拥有与 JWT 等相关联的所有负载,因此您不妨对每个用户操作重新进行身份验证。

2)(黑名单用户/服务器RAM中的令牌)当我为自己研究这个问题(如何使单个令牌无效)时,我找到了一些解决方案,其中服务器在RAM中维护白名单或黑名单,因此无需添加数据库或文件加载。这可能是一个更好的解决方案,但我不记得任何促进这一点的库的名称。也许其他人可以提及其中一些。

3)将令牌设置为非常短的到期时间(例如 60 秒或 5 分钟)并将客户端设置为每(~55秒或~4分50秒)自动请求一个新令牌。然后,服务器会以我假设您现在正在执行的相同方式检查和验证令牌,而无需访问数据库,然后会为所有其他字段生成一个具有相同值的新令牌,但具有新的“到期时间” " 值,然后将该令牌发送回客户端,客户端将使用此新 JWT 替换其 JWT,然后重新启动其 5 分钟计时器。这是其他选择之间的一个很好的平衡,并保留了使用 JWT 的一些好处,但确实增加了一些小成本。我认为这对于许多应用程序来说是一个很好的解决方案,但它绝对取决于特定的应用程序,但它有点hacky,绝对不是“正确的方法”。

4)使用 JWT + Sessions这是做到这一点的“正确方法”。经过我很久以前的所有研究,我意识到JWT 不是为维护会话而设计的:JWT 只是一种表示声明的安全方式。想象一下,拥有一个拥有数千万用户的大型系统,并且您需要遍布全球的许多服务器。您可能有 3 个身份验证服务器(在美国、澳大利亚、英国)。然后用户将其用户名和密码发送到身份验证服务器,在那里将在数据库中检查详细信息,如果有效,将发送 JWT。然后,您可能还有 10 多个常规服务器来处理您的 API。然后,客户端将使用其 JWT 向 API 服务器发出每个请求。API 服务器将拥有身份验证服务器用于生成 JWT 的密钥的副本,并将验证您的声明. 您的声明是“我已通过身份验证”。然后这个 API 服务器将生成一个会话,客户端将被“登录”。JWT 可以设置为在 5 分钟后过期。如果用户在这 5 分钟内没有登录,他们将无法登录。如果他们登录,他们将一直登录,直到 API 服务器将他们踢出去。每当发生会导致您想要踢用户的事情时,API 服务器都可以关闭会话。即使对于单服务器应用程序,这仍然是正确的方法。JWT 不适用于会话,您(正如我所做的那样)开始注意到这些看似无法解决的问题,因为您将 JWT 用于会话。

无论如何,我推荐 3 或 4,这两个选项对许多应用程序都有净正值。

1 和 2 似乎制造的问题比它们提供的好处更多。

当然,这始终取决于应用程序。如果您只是以 5 美元的价格在 Fiverr 上制作一些网站,那么您可以做任何事情,您知道我的意思吗?

如果有更好的解决方案,我也很想知道!请记住,JWT 代表一个声明,并准确考虑您的客户所代表的声明。