json 网络令牌、passport-jwt 及其验证功能

json web tokens, passport-jwt and its verify function

我最近一直在研究 json 网络令牌。据我所知,它的一大优势是它是无状态的。验证用户所需的一切都随请求一起提供,因此您不需要 "hit the database on every request" 正如许多文章所述。

但是,如果我没记错的话,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})
}));

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

Someone could use its own token, to access your API.`

你的想法是正确的,它是JWT认证的主要驱动力。您使用另一个护照策略验证密码,并发出您的 signed JWT 令牌。由于它是由您的秘密签名的,因此无法修改。使用另一个 sekret 创建的任何其他 JWT 令牌将无法通过验证。

我正要创建 passport-jwt 的问题,我发现 this closed issue,有人指出了文档中的问题。

我没有使用 passport-jwt,因为我发现使用 passport-custom 更容易,而且我自己设置 cookie。

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

中的用户

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