在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
如果一切正确,则继续进行正常请求。
答案 0 :(得分:0)
私钥背后的原因是要确保用户不更改令牌。因此,存储令牌中经常使用的对象是绝对安全的,并且无需将令牌存储在任何地方。签名的对象看起来像这样:
{
expirationDate: 1560530063664,
...user data
}
要将某个令牌列入黑名单,我认为最好的方法是您想到的方法。根据您同时访问该网站的用户数量,仅使用大腿阵列可能是一个好主意。
尽管可以将令牌列入黑名单可能很好,但这是否真的有必要?如果用户更新了密码,是否真的需要注销?如果您仍然认为需要令牌存储,我相信可以使用多个npm软件包...