2017-06-03 134 views
2

最近我一直在对json网络令牌进行一些研究。从我所收集到的信息来看,它的一大优点就是它的无状态。正如许多文章所述,您需要对用户进行身份验证所需的一切都与请求一起提供,因此您无需“按照每个请求来访问数据库”。json网络令牌,护照-jwt及其验证功能

但是,如果我没有弄错,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

我不同意莱安德罗。他是不正确时,他说:

有人可能会使用它自己的道理,访问您的API.`

你在你的思维正确的,它是智威汤逊autentication的主要驱动力。您使用另一张护照过滤器验证密码,并签发签名的 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验证仅检查令牌是否由您发出,即用户已登录。但是您可以确定令牌中的信息未被篡改,并将其用于任何进一步检查 - 可能需要或可能不需要数据库调用。