Node.js - Express.js JWT,如何检查令牌是否过期?

9
如何检查我的令牌是否过期?
var token = jwt.sign(user,app.get('superSecret'),{
    expiresIn : 2
});
9个回答

26

我假设您正在使用 此处记录的 jsonwebtoken 包。

如果是这样的话,请查看 jwt.verify 方法:

jwt.verify(token, 'shhhhh', function(err, decoded) {
  if (err) {
    /*
      err = {
        name: 'TokenExpiredError',
        message: 'jwt expired',
        expiredAt: 1408621000
      }
    */
  }
});

简单来说:检查那个方法的错误。如果是 TokenExpiredError,那么猜猜看……令牌已过期。


1
实际上,我将令牌过期时间设置为2秒,但我的令牌并没有过期。 - Karthik
没有错误!即使已经超过了5分钟,您能解释一下吗? - Karthik

17
var isExpiredToken = false;

var dateNow = new Date();

if(decodedToken.exp < dateNow.getTime()/1000)

{
       isExpiredToken = true;
}

1
你好,lakshman。我看到你在将日期除以1000(因为exp是以秒为单位),而顶部答案是错误的。虽然这似乎是一个有效的答案,但你最好建议将其作为对顶部投票答案的编辑(只要你有一个清晰的编辑摘要来解释当前代码为什么是错误的)。目前,这个答案已经进入了低质量帖子队列,可能会被删除。干杯! - Andrew Myers
1
它在LQ队列中的原因可能是因为它只是一个代码答案。添加一些解释,说明为什么这个解决方案比其他类似的解决方案更好,会有所帮助。 - jps

7
var isExpiredToken = false;

var dateNow = new Date();

if(decodedToken.exp < dateNow.getTime())

{
       isExpiredToken = true;
}

2
那是错误的。dateNow.getTime() 返回毫秒,而 decodedToken.exp 是以秒为单位的。 - rok

0

0

你需要添加一个错误实例

const decoded = verify(token, process.env.TOKEN_KEY || '', (err: any, decoded: any) => {
  if (err instanceof TokenExpiredError) {
    return res.status(401).send({ success: false, message: 'Unauthorized! Access Token was expired!' });
  }
  if (err instanceof NotBeforeError) {
    return res.status(401).send({ success: false, message: 'jwt not active' });
  }
  if (err instanceof JsonWebTokenError) {
    return res.status(401).send({ success: false, message: 'jwt malformed' });
  }
});

0
这个方法对我来说很有效。
如果你在签名的令牌上设置了过期日期,JWT会为你验证它。
签署一个令牌。

  try {
    const token = jwt.sign({ uuid: '123456' }, JWT_SECRET, { expiresIn: '1min' })
    return token
  } catch (error: unknown) {
    if (error instanceof jwt.JsonWebTokenError) {
      return error.message
    }
  }

验证

try {
    const token = ''
    const decoded = jwt.verify(token, JWT_SECRET)
    return decoded
  } catch (error: unknown) {
    if (error instanceof jwt.JsonWebTokenError) {
      return error.message
    }
  }

在1分钟后(expiresIn: '1min'),令牌将变为无效。

0

在验证函数示例中,您需要设置主机当前时间以比较到期日期:

jwt.verify(token, JWT.SECRET_KEY, {clockTimestamp: new Date().getTime()}, callback)

必须设置clockTimestamp属性以设置主机当前时间。


0

在“过期时间”中使用键名“iat”...希望它能起作用


为什么应该使用“iat”(发行时间)? iat 是令牌发行的时间,而不是过期时间。 - jps

0

将代码放置在您的页面或包装器的父组件中是最佳方式。 您需要删除旧的(过期的)令牌。

 let token = localStorage.getItem( 'token' );

 jwt.verify( token, 'yourkey', function(err, decoded) {

    if ( err ) {

    localStorage.removeItem( 'token' );

    }

  } );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接