jsonnetworking令牌,passport-jwt及其validationfunction

我最近在做jsonnetworking令牌的研究。 从我所收集的资料来看,它的一大优势就是它的无国籍。 一切你需要authentication的用户来与请求,因此你不需要“击中每个请求的数据库”,许多文章说。

但是,如果我没有弄错,那么passport-jwt的文档就是这么做的,他们在每个请求中都打了数据库。 也就是说,对于每个需要通行证authentication的请求。

 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 } }); })); 

我的印象是,当这个函数被调用的时候, 令牌已经被validation ,否则这个函数将不会被调用,并且用户被401 unauthorized401 unauthorized

那为什么要检查用户的数据库? 由于这个代码是在文档中,我通过检查数据库来做同样的事情,但是我真的需要吗? 为什么我不应该这样做

 passport.use(new JwtStrategy(opts, function(jwt_payload, done) { //this is a database call done(null, {id: jwt_payload.sub}) })); 

我不同意莱昂德罗。 他说:

有人可以使用自己的令牌来访问你的API

你的想法是正确的,这是JWTauthentication的主要动力。 您可以使用其他护照filter进行密码validation,并签发已签名的 JWT令牌。 由于它由你的sekret签名,它不能被修改。 任何由另一个sekret创build的其他JWT标记将无法validation。

我正要用passport-jwt创build一个问题,我发现这个问题是closures的 ,有人指出你的文档有问题。

我没有使用passport-jwt,因为我发现使用passport-custom更简单,只需要自己设置cookie即可。

值得注意的是,你可能仍然需要检查数据库。 如果你有一个API调用像api\getSuperSekretUserInfo\[userId]那么你将需要检查request.user.id === params.userId (或其他)。 同样,如果您正在访问api\getInvoice\231您将需要检查id为231的发票属于request.user的用户。

JWTvalidation只检查令牌是否由您发出,即用户已经login。 但是您可以确定令牌中的信息未被篡改,并将其用于任何进一步的检查 – 可能需要或可能不需要数据库调用。