J'ai configuré le jeton comme ceci:
jwt.sign(
{
user: pick(user, ['_id', 'username'])
},
secret,
{
expiresIn: '2m'
}
);
Mais quand je veux vérifier si le jeton a expiré, ce code ne fonctionne pas
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;
}
Le problème est cette partie:
if (exp < (new Date().getTime() + 1) / 1000) {
return false;
}
new Date (). getTime () + 1)/1000 = 1531335468.113
exp = 1531334595
Parce que je ne sais pas quel format de temps utilise JWT ...
Comment puis-je résoudre ça?
Je vous remercie!
Ceci est la réponse si quelqu'un veut savoir
if (Date.now() >= exp * 1000) {
return false;
}
Vous devriez utiliser jwt.verify il vérifiera si le jeton a expiré. jwt.decode ne doit pas être utilisé si la source n'est pas approuvée car elle ne vérifie pas si le jeton est valide.
verify
renvoie lui-même une erreur si elle a expiré. Plus sûr comme l'a dit @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()
});
}))
Malheureusement, @ Andrés Montoya a une faille liée à la façon dont il compare l’obj. J'ai trouvé une solution ici qui devrait résoudre ceci:
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)}`)
}
Merci à thejohnfreeman!