我目前正在尝试使用express,node和MongoDB构建REST API。现在进行身份验证,我正在使用JWT。
这是检查JWT令牌的代码
const token = req.headers['authorization'];
if (token){
const tokens = token.split(' ');
const key = tokens[1];
jwt.verify(key, config.jwtKey, (err, authData) => {
if (err){
res.status(403).json({
success: false,
message: "Authentication2 failed"
});
}
// User authenticated
// Do something
next();
});
} else {
res.status(403).json({
success: false,
message: "Authentication failed"
});
}
现在,此代码可以完美运行。
为了制作JWT,下面是代码
........
........
const token = jwt.sign(
{
email: user[0]._email,
userId: user[0]._id
}, config.jwtKey,{ expiresIn: "1d" });
........
........
现在我的问题是,我是否还应该通过检查数据库中用户信息的存在来验证用户,以使其更加安全?
例如,在我的数据库中搜索email
和userId
。
我正在为此项目使用node,express,MongoDB,Mongoose和JWT。
答案 0 :(得分:1)
使用令牌的优势在于服务器可以 无需调用MongoDB等外部数据存储即可快速进行验证。
但是,如果您要向API身份验证添加企业登录名(如已撤销令牌的黑名单/白名单),则必须使用商店来验证令牌和用户详细信息,(比不进行远程操作要慢调用每个令牌,但您必须做到低延迟)。
对于低延迟,您必须像Redis一样使用数据库,而Dynamodb可能会很好且更安全,而数据库与API服务器之间不会出现较大延迟。
不需要通过DB验证签名,您可以使用JWT算法
答案 1 :(得分:1)
这是一个古老的问题,但我想留下一个答案: 是!每当您的客户端发出api请求时,后端都应验证令牌的有效性以及后端中某处的存在(例如db表)。 始终考虑最危险的情况:银行帐户 如果有人偷了您的设备会怎样? 您应该能够使其他设备上的令牌失效并更改密码。
答案 2 :(得分:0)
使用所选算法验证令牌(的签名)足以确保该用户存在(或存在)在系统上,因为首先是由系统生成令牌的。
但是在某些情况下,这还不够,例如,Roy G的答案中提到的黑名单,或者用户的声明已被更改或完全从系统中删除,但他们仍使用旧令牌(尚未过期) ),他们仍然可以访问系统,因此针对DB进行检查将阻止该访问。
与刷新令牌结合设置一个较小的到期日期通常是防止此类泄漏的好习惯。