JWT有效负载内的令牌

时间:2019-06-14 15:34:28

标签: node.js security jwt token

在JWT有效负载中包含一个随机生成的令牌,并在每次请求时检查数据库是否是一个好主意?

我已经完成了有关JWT及其实际工作方式的研究,我知道它的主要目的是避免在每次请求中查询数据库以授权用户,但是我仍然必须这样做,因为我需要有关以下内容的某些信息:发出请求的用户。

如果需要,我还需要一个好的解决方案来立即吊销令牌。 最初,将令牌列入黑名单似乎是一个不错的解决方案,但是这需要额外的请求,我认为这样做不值得。

因此,我想出的解决方案是生成一个随机令牌并将该令牌保存在数据库中,并将其放入JWT有效负载中。 这样,当用户发出新请求时,它首先检查JWT令牌是否有效,然后再检查有效负载中关联的令牌是否有效。

例如,如果用户需要更改其密码,则其令牌将更改,并且其有效负载中带有先前令牌的所有JWT令牌都将无法通过验证。

所以解决方案是这样的:

用户注册时,将为其分配一个randomToken并将其存储在有效负载中。如果注册成功,则服务器返回生成的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

如果一切正确,则继续进行正常请求。

1 个答案:

答案 0 :(得分:0)

“这是个好主意吗?”不是问问题的好方法,但我会尽力回答...

1。 JWT是安全的

私钥背后的原因是要确保用户不更改令牌。因此,存储令牌中经常使用的对象是绝对安全的,并且无需将令牌存储在任何地方。签名的对象看起来像这样:

{
  expirationDate: 1560530063664,
  ...user data
}

2。将令牌列入黑名单和吊销

要将某个令牌列入黑名单,我认为最好的方法是您想到的方法。根据您同时访问该网站的用户数量,仅使用大腿阵列可能是一个好主意。

尽管可以将令牌列入黑名单可能很好,但这是否真的有必要?如果用户更新了密码,是否真的需要注销?如果您仍然认为需要令牌存储,我相信可以使用多个npm软件包...