Revoke/invalidate 带有 JWT 的令牌

Revoke/invalidate a token with JWT

我正在使用带有节点的 JWT (jsonwebtoken) 包来处理令牌。

有什么方法可以"logout"/revoke/invalidate一个token吗?

我喜欢那个有这个问题,我是这样决定的: 首先,我为数据库创建模型会话,如下所示:

var SessionSchema = new Schema({
    user_id:   { type: String, required: true },
    tokenHash: { type: String, required: true }
});

创建令牌后我保存会话,当用户在我的 "checkSession" 中间件中做某事时我在数据库中搜索令牌,如果他存在我验证他,如果不存在发送 auth_error,如果令牌存在在数据库中但已过期,我将他从数据库中删除并发送 auth_error,如果我删除或阻止用户,我将会话从数据库中删除到。

试试吧,也许这对你有帮助。

使用 jwt 身份验证无需将令牌插入数据库,如果您想 revoke/logout/invalidate 令牌,只需在您决定存储它的浏览器本地删除它(cookie 或header), 在这种情况下,在下一次调用任何路由(受身份验证保护)时,服务器,如果有一个好的程序员,应该再次要求您进行身份验证。

希望这对你有帮助,再见。

如果您只想注销当前用户,如@Massimiliano 所说,通常通过从您一直用来跟踪它的任何客户端存​​储(例如 cookie)中删除令牌来实现。

如果您出于安全原因需要撤销,这里有一篇文章讨论了为什么您可能不想首先使用 JWT,而是使用常规的、不透明的 Bearer 令牌(通过将它们存储在数据库中来实现,通常使用安全的随机字符串作为他们的 ID)。

https://www.dinochiesa.net/?p=1388

基本上,如果不添加数据库查找,它们是不可撤销的(首先否定使用 JWT 的主要原因之一)。在需要通过用户界面撤销的情况下,您将希望能够通过 user_idgroup_id 或类似方式查询令牌,因此您希望能够通过该信息索引标记,而不是让它在 JWT 声明中不透明。