为了账号安全,请及时绑定邮箱和手机立即绑定

PassportJS 验证过期的 JWT

PassportJS 验证过期的 JWT

MYYA 2022-10-21 15:34:37
我的问题的症结在于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.jsconst 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 正文传回用户详细信息我确定我错过了一些明显的东西,但对于我的生活,我无法弄清楚发生了什么。提前感谢您的帮助!
查看完整描述

2 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

好的,所以我想通了!


事实证明(通过查看 jsonwebtoken 文档上的示例)签署令牌时使用的 iat 属性应该以秒为单位而不是毫秒。因此,Date.now()在 tokens.js 实际上应该是Math.floor(Date.now / 1000):


// In token.js (used to issue JWT)

const jsonwebtoken = require("jsonwebtoken");

// ...


const issueJWT = (user) => {

  const _id = user._id;

  const expiresIn = 30; // 30s for testing purposes


  const payload = {

    sub: _id,

    iat: Math.floor(Date.now() / 1000),

  };


  const signedToken = jsonwebtoken.sign(payload, PRIV_KEY, {

    expiresIn: expiresIn,

    algorithm: "RS256",

  });


  return {

    token: "Bearer " + signedToken,

    expires: expiresIn,

  };

};


查看完整回答
反对 回复 2022-10-21
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

我认为您应该在对象中设置Maxage令牌jwt的 ,options因为护照正在使用jsonwebtoken模块验证令牌,而且如果您将ignoreExpiration选项设置为 true 护照将不会验证令牌的过期,我知道情况并非如此,因为我可以'在你的代码中看不到它,但我最好的猜测是你必须Maxage像这样设置你的选项{ expiresIn: '1h' }

文档

jsonWebTokenOptions:passport-jwt 正在使用 jsonwebtoken 验证令牌。在此处为您可以传递 jsonwebtoken 验证程序的任何其他选项传递一个选项对象。(即maxAge)

如果您想了解有关jsonwebtoken的更多信息


查看完整回答
反对 回复 2022-10-21
  • 2 回答
  • 0 关注
  • 92 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信