我最近一直在研究json网络令牌。从我收集到的,它的一大优势是它的无国籍。验证用户所需的一切都附带了请求,因此您不需要像许多文章所说的那样“按每次请求命中数据库”。
但是,如果我没有弄错,passport-jwt
的文档就是这样做的,他们就会在每次请求时点击数据库。也就是说,对于每个需要护照身份验证的请求。
passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
//this is a database call
User.findOne({id: jwt_payload.sub}, function(err, user) {
if (err) {
return done(err, false);
}
if (user) {
done(null, user);
} else {
done(null, false);
// or you could create a new account
}
});
}));
我的印象是,当调用此函数时,该令牌已经过验证,否则将无法调用此函数并且用户获得401 unauthorized
。
那么为什么要检查用户的数据库呢?由于此代码在文档中,我通过检查数据库做同样的事情,但我真的需要吗?为什么我不应该这样做
passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
//this is a database call
done(null, {id: jwt_payload.sub})
}));
答案 0 :(得分:0)
我不同意Leandro。当他说:
时,他是不正确的有人可以使用自己的令牌来访问您的API。
您的想法是正确的,它是JWT身份验证的主要驱动因素。您使用其他护照stratergy验证密码,并发出签名 JWT令牌。由于它是由您的sekret签署的,因此无法修改。使用另一个sekret创建的任何其他JWT令牌都将无法通过验证。
我刚要创建passport-jwt
的问题,我找到了this closed issue,有人指出了您对文档的问题。
我没有使用passport-jwt,因为我发现使用passport-custom更容易,只是自己设置cookie。
值得注意的是,您可能仍需要检查数据库。如果您有api\getSuperSekretUserInfo\[userId]
之类的API调用,那么您需要检查request.user.id === params.userId
(或其他)。同样,如果您访问api\getInvoice\231
,则需要检查ID为231的发票属于request.user
中的用户。
JWT验证仅检查令牌是否由您发出,即用户已登录。但您可以确定令牌中的信息未被篡改,并将其用于任何进一步的检查 - 这可能需要也可能不需要数据库调用。