jwt检查令牌是否过期

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jwt检查令牌是否过期相关的知识,希望对你有一定的参考价值。

我已经像这样配置了令牌:

jwt.sign(
  
    user: pick(user, ['_id', 'username'])
  ,
  secret,
  
    expiresIn: '2m'
  
);

但是,当我想检查令牌是否已过期时,此代码不起作用

function isAuthenticated() 
  const token = localStorage.getItem('token');
  const refreshToken = localStorage.getItem('refreshToken');
  try 
    decode(token);
    const  exp  = decode(refreshToken);
    if (exp < (new Date().getTime() + 1) / 1000) 
      return false;
    
   catch (err) 
    return false;
  
  return true;

问题是这部分:

if (exp < (new Date().getTime() + 1) / 1000) 
  return false;

new Date()。getTime()+ 1)/ 1000 = 1531335468.113

exp = 1531334595

因为我不知道JWT使用什么格式的时间......

我该如何解决这个问题?

谢谢!

答案

如果有人想知道,这就是答案

if (Date.now() >= exp * 1000) 
  return false;

另一答案

您应该使用jwt.verify它将检查令牌是否过期。如果源不受信任,则不应使用jwt.decode,因为它不会检查令牌是否有效。

另一答案

如果过期,verify本身会返回错误。更加安全,因为@Gabriel说。

const jwt = require('jsonwebtoken')

router.use(asyncWrap (async (req, res, next) => 
  let token = jwtService.getBearerToken(req)
  jwt.verify(token, req.app.get('your-secret'), function(err, decoded) 
    if (err) throw new Error(err) // Manage different errors here (Expired, untrusted...)
    req.auth = decoded // If no error, token info is returned in 'decoded'
  );
  next()
))
另一答案

可悲的是,@AndrésMontoya的回答有一个与他如何比较obj相关的缺陷。我找到了一个解决方案here应该解决这个问题:

const now = Date.now().valueOf() / 1000

if (typeof decoded.exp !== 'undefined' && decoded.exp < now) 
    throw new Error(`token expired: $JSON.stringify(decoded)`)

if (typeof decoded.nbf !== 'undefined' && decoded.nbf > now) 
    throw new Error(`token expired: $JSON.stringify(decoded)`)

感谢jojofreeman!

以上是关于jwt检查令牌是否过期的主要内容,如果未能解决你的问题,请参考以下文章

如果存储在本地存储中,检查 jwt 令牌过期状态的最佳方法

如何手动使 JWT 令牌过期?

如何使用 redux-saga 在 API 响应中检查过期的 JWT 令牌?

访问令牌和刷新令牌流程

如何验证nodejs中的jwt令牌/永不过期?

使以前的令牌无效并检查用户是不是有 JWT 令牌