【问题标题】:json web tokens, passport-jwt and its verify functionjson web 令牌、passport-jwt 及其验证功能
【发布时间】:2017-10-10 16:56:01
【问题描述】:

我最近一直在做一些关于 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})
}));

【问题讨论】:

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


    【解决方案1】:

    我不同意莱安德罗。他说的不对:

    有人可以使用自己的令牌来访问您的 API。`

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

    【讨论】:

      猜你喜欢
      • 2018-05-07
      • 2015-09-20
      • 1970-01-01
      • 2019-01-22
      • 2018-07-01
      • 2016-08-01
      • 2019-06-23
      • 2016-01-02
      • 2017-03-04
      相关资源
      最近更新 更多