jwt检查令牌是否过期

时间:2018-07-11 18:52:12

标签: node.js express 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使用哪种时间格式...

我该如何解决?

谢谢!

8 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:5)

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

答案 2 :(得分:1)

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()
}))

答案 3 :(得分:1)

以下函数无需任何库即可工作:

function getJWTExpireDate(jwtToken: string) {
  if (jwtToken) {
    try {
      const [, payload] = jwtToken.split('.');
      const { exp: expires } = JSON.parse(window.atob(payload));
      if (typeof expires === 'number') {
        return new Date(expires * 1000);
      }
    } catch {
      // ignore
    }
  }
  return null;
}

不要用它来检查令牌是否有效。一个很好的用例是在前端显示令牌何时过期。

答案 4 :(得分:0)

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

{{1}}

感谢约翰·弗里德曼!

答案 5 :(得分:0)

这是对react-native的,但是登录将适用于所有类型。

isTokenExpired = async () => {
    try {
        const LoginTokenValue = await AsyncStorage.getItem('LoginTokenValue');
        if (JSON.parse(LoginTokenValue).RememberMe) {
            const { exp } = JwtDecode(LoginTokenValue);
            if (exp < (new Date().getTime() + 1) / 1000) {
                this.handleSetTimeout();
                return false;
            } else {
                //Navigate inside the application
                return true;
            }
        } else {
            //Navigate to the login page
        }
    } catch (err) {
        console.log('Spalsh -> isTokenExpired -> err', err);
        //Navigate to the login page
        return false;
    }
}

答案 6 :(得分:0)

您可以使用 jwt verify 方法来检查您的令牌的有效性。 Err 表示令牌已过期,将引发错误,以便您可以删除存储的令牌。

 jwt.verify(token, SECRET, (err, decoded) => {
      if (err) {
          localStorage.clear();
      }}
  });

答案 7 :(得分:-1)

// Pass in function expiration date to check token 
function checkToken(exp) {
    if (Date.now() <= exp * 1000) {
      console.log(true, 'token is not expired')
    } else { 
      console.log(false, 'token is expired') 
    }
  }