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检查令牌是否过期的主要内容,如果未能解决你的问题,请参考以下文章