【发布时间】:2019-10-29 06:39:25
【问题描述】:
在 JWT 有效负载中包含一个随机生成的令牌并在每个请求上检查数据库是否是个好主意?
我已经对 JWT 及其实际工作原理进行了研究,我知道它的主要目的是避免在每次请求时查询数据库以授权用户,但我仍然必须这样做,因为我需要一些关于发出请求的用户。
如果需要,我还需要一个好的解决方案来立即撤销令牌。 最初将令牌列入黑名单似乎是一个很好的解决方案,但这需要额外的请求,我认为这不值得。
所以我想出的解决方案是生成一个随机令牌并将该令牌保存在我的数据库中,并将其放入 JWT 有效负载中。 这样,当用户发出新请求时,它首先检查 JWT 令牌是否有效,如果有效,则检查负载中关联的令牌是否有效。
因此,例如,如果用户需要更改他的密码,他的令牌将会更改,并且其有效负载中包含先前令牌的所有 JWT 令牌都将无法验证。
所以解决方案是这样的:
当用户注册时,它会被分配一个随机令牌,并存储在有效负载中。如果注册成功,服务器返回生成的jwtToken。
var jwtToken = jwt.sign({token: randomToken}, PRIVATE_KEY, SIGN_OPTIONS);
所以当用户发出新请求时,它首先会检查 JWT 令牌是否有效。
var legit = jwt.verify(token, JWT_PUBLIC_KEY, SIGN_OPTIONS);
如果是,则继续使用数据库中的用户令牌检查有效负载内的令牌。
SELECT * FROM users WHERE token = legit.token
如果一切正确,则继续正常请求。
【问题讨论】:
-
这违背了使用 JWT 的全部意义。您说您理解这一点,但如果您必须进行数据库查找,实际上您不应该使用 JWT。 dzone.com/articles/stop-using-jwts-as-session-tokens
-
@TheGreatContini 感谢您的链接。他说的完全有道理,但我忘了提到我的意图是在我的移动应用程序中使用它,正如文章所说,“如果你正在构建需要支持服务器到服务器或客户端到服务器的 API 服务-服务器(如移动应用或单页应用 (SPA))通信,使用 JWT 作为 API 令牌是一个非常聪明的想法。”
标签: node.js security jwt token