我的问题的症结在于PassportJS 似乎正在验证一个 JWT,它应该是无效的,因为当前时间超过了 exp 参数。
我已经提供了相关的代码片段和我认为应该发生的事情的解释(尽管它显然不是!!)
编码
// In server.js
// ...
const passport = require("passport");
// ...
require("./config/passport")(passport);
app.use(passport.initialize());
// ...
// In token.js (used to issue JWT)
const jsonwebtoken = require("jsonwebtoken");
// ...
const issueJWT = (user) => {
const _id = user._id;
const expiresIn = 30000; // 30s for testing purposes
const payload = {
sub: _id,
iat: Date.now(),
};
const signedToken = jsonwebtoken.sign(payload, PRIV_KEY, {
expiresIn: expiresIn,
algorithm: "RS256",
});
return {
token: "Bearer " + signedToken,
expires: expiresIn,
};
};
// In passport.js
const JwtStrategy = require("passport-jwt").Strategy;
const ExtractJwt = require("passport-jwt").ExtractJwt;
// ...
const options = {
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: PUB_KEY,
algorithms: ["RS256"],
};
module.exports = (passport) => {
passport.use(
new JwtStrategy(options, (jwt_payload, done) => {
User.findOne({ _id: jwt_payload.sub }, (err, user) => {
if (err) {
return done(err, false);
}
if (user) {
return done(null, user);
} else {
return done(null, false);
}
});
})
);
};
客户端使用身份验证标头中的承载令牌 (JWT) 向 /authenticate-with-access-token 发送 GET 请求
PassportJS(通过jsonwebtoken.verify()
)尝试验证 JWT,但发现Date.now()
超过了 JWT 的过期时间
PassportJS 引发错误,使用 401 Unauthorized 响应解决请求
客户端使用身份验证标头中的承载令牌 (JWT) 向 /authenticate-with-access-token 发送 GET 请求
PassportJS 将用户对象传入请求体并调用next()
最后一个中间件运行,使用 200 OK 响应解析请求,并通过 JSON 正文传回用户详细信息
我确定我错过了一些明显的东西,但对于我的生活,我无法弄清楚发生了什么。提前感谢您的帮助!
红颜莎娜
有只小跳蛙
相关分类