json web令牌,passport-jwt及其验证功能

时间:2017-06-03 02:27:45

标签: node.js jwt passport.js json-web-token

我最近一直在研究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})
}));

1 个答案:

答案 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验证仅检查令牌是否由您发出,即用户已登录。但您可以确定令牌中的信息未被篡改,并将其用于任何进一步的检查 - 这可能需要也可能不需要数据库调用。