【问题标题】:Nodejs jwt token never expiresNodejs jwt 令牌永不过期
【发布时间】:2021-10-03 22:12:16
【问题描述】:

我使用 jsonwebtoken 创建 jwt 令牌。我将令牌设置为在 5 分钟后过期以检查但令牌永不过期,我总是同时得到 iatexp,如下面的日志:

{ 
   sub: '10001', 
   iat: 1627452909247, 
   exp: 1627452909547 
}
Issue at time: 7/28/2021, 1:15:09 PM | 1627452909247
Expire at time: 7/28/2021, 1:15:09 PM | 1627452909547

以下是我的问题代码和验证令牌:

const crypto = require('crypto');
const path = require('path');
const fs = require('fs');
const jwt = require('jsonwebtoken');

// Public Key
const pathToPublicKey = path.join( __dirname , ".." ,"/id_rsa_pub.pem");
const publicKey = fs.readFileSync(pathToPublicKey , "utf8");

// Private Key
const pathToPrivateKey = path.join( __dirname , ".." ,"/id_rsa_priv.pem");
const privateKey = fs.readFileSync(pathToPrivateKey , "utf8");

//const expiresIn = '5';
const expiresIn = '5m';
//const expiresIn = '1h';
//const expiresIn = '1d';

const issueJWT = (user) => {

  const user_id = user.user_id;

  const payload = {
    sub: user_id,
    iat: Date.now()
  };

  const jwtOptions = {
    expiresIn: expiresIn,
    algorithm: 'RS256'
  };

  const signedToken = jwt.sign(payload, privateKey, jwtOptions);

  return{
    token: "Bearer " + signedToken,
    expires: expiresIn,
  };

};

const authMiddleware = (req, res, next) => {
  const tokenParts = req.headers.authorization.split(" ");
  
  const jwtOptions = {
    expiresIn: expiresIn,
    algorithms: ['RS256']
  };

  if(tokenParts[0] === "Bearer" && tokenParts[1].match(/\S+\.\S+\.\S+/) !== null)
  {
    try {
      const verification =jwt.verify(tokenParts[1], publicKey, jwtOptions);
      req.jwt = verification ;
      next();
    } catch (error) {
      res.status(401).json({succsess: false , message: 'User Not Authenticated'});
    }
  }
}

module.exports = { issueJWT, authMiddleware};

试了很多方法还是不行。

【问题讨论】:

    标签: javascript node.js express jwt bearer-token


    【解决方案1】:

    时间戳错误。检查https://jwt.io 中的令牌并用鼠标指向时间戳以查看这些值是如何解释的。

    JWT 中的时间戳是从 01.01.1970 00:00 UTC 算起的 UNIX 时间戳,而不是毫秒(有关详细信息,请参阅 my answer)。

    过期时间exp的设置方式

    const expiresIn = '5m';
    const jwtOptions = {
        expiresIn: expiresIn,
        algorithms: ['RS256']
      };
    const signedToken = jwt.sign(payload, privateKey, jwtOptions);
    

    是正确的,如果你删除iat: Date.now() 行,你会得到一个正确的 令牌,即使是 iat,因为该值会自动包含在内。

    {
      "iat": 1627506023,
      "exp": 1627506323
    }
    

    但是如果包含iat: Date.now()这一行,它不仅会产生错误的iat,而且exp会被计算为iat + 300(300秒或5分钟),也会出错。

    {
      "iat": 1627506191289,
      "exp": 1627506191589
    }
    

    解决方案是简单地从您的代码中删除行 iat: Date.now()。 如果您确实需要一个正确格式的时间戳,并且要根据Date.now() 计算,您必须将该值除以 1000 并去除小数,例如:

    nbf: Math.floor(Date.now()/1000)
    

    【讨论】:

      猜你喜欢
      • 2020-01-15
      • 2018-02-05
      • 2017-03-04
      • 2019-07-04
      • 2020-04-07
      • 2020-02-23
      • 2018-06-19
      • 2019-08-08
      • 1970-01-01
      相关资源
      最近更新 更多