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