我在 hapijs 中使用 jwt 插件和策略。
我能够在登录用户时创建 jwt 令牌,并通过“jwt”策略使用相同的令牌对其他 API 进行身份验证。
我将 request.state.USER_SESSION
中的令牌设置为 cookie,其中 USER_SESSION
是令牌名称。另外,我没有将这些令牌保存在数据库中。
但是如何在注销时销毁 jwt 令牌?
请提出一种方法。
原文由 Garima 发布,翻译遵循 CC BY-SA 4.0 许可协议
您不能在令牌创建后手动使其过期。因此,您不能像在会话中那样在服务器端使用 JWT 注销。
JWT 是无状态的,这意味着您应该将所需的一切存储在有效负载中,并跳过对每个请求执行数据库查询。但是如果你打算有一个严格的注销功能,不能等待令牌自动过期,即使你已经从客户端清除了令牌,那么你可能需要忽略无状态逻辑并进行一些查询。那么解决方案是什么?
为令牌设置合理的过期时间
注销后从客户端删除存储的令牌
在每个授权请求中查询提供给 黑名单 的令牌
所有不再有效且尚未过期的令牌的“黑名单”。您可以在文档上使用具有 TTL 选项的数据库,该选项将设置为令牌过期前剩余的时间量。
Redis 是 blacklist 的一个很好的选择,它将允许在内存中快速访问列表。然后,在针对每个授权请求运行的某种中间件中,您应该检查提供的令牌是否在 The Blacklist 中。如果是,你应该抛出一个未经授权的错误。如果不是,让它过去,JWT 验证将处理它并确定它是否已过期或仍然有效。
有关详细信息,请参阅 使用 JWT 时如何注销。作者 Arpy Vanyan(信用和参考)
原文由 Jamil Noyda 发布,翻译遵循 CC BY-SA 4.0 许可协议
5 回答4.8k 阅读✓ 已解决
4 回答2.5k 阅读✓ 已解决
2 回答1.7k 阅读✓ 已解决
5 回答1.9k 阅读
2 回答1.3k 阅读✓ 已解决
3 回答2k 阅读
1 回答3.2k 阅读
JWT 存储在浏览器上,因此删除客户端删除 cookie 的令牌
如果您还需要在过期时间之前从服务器端使令牌失效,例如帐户删除/阻止/暂停、密码更改、权限更改、用户由管理员注销,请查看 Invalidating JSON Web Tokens 以了解一些常见技术,例如创建黑名单或轮换令牌