He configurado el token así:
jwt.sign( { user: pick(user, ['_id', 'username']) }, secret, { expiresIn: '2m' } );
Pero cuando quiero verificar si el token expiró, este código no funciona:
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; }
El problema es esta parte:
if (exp < (new Date().getTime() + 1) / 1000) { return false; }
nueva Fecha().getTime() + 1) / 1000 = 1531335468.113
exp = 1531334595
Porque no sé qué formato de tiempo usa JWT ...
¿Cómo puedo resolver esto?
Esta es la respuesta:
if (Date.now() >= exp * 1000) { return false; }
Deberías usar jwt.verify . Comprobará si el token ha caducado.
jwt.decode no debe usarse si la fuente no es confiable, ya que no verifica si el token es válido.
Función sin la biblioteca jwt
:
Navegador
function isTokenExpired(token) { const base64Url = token.split(".")[1]; const base64 = base64Url.replace(/-/g, "+").replace(/_/g, "/"); const jsonPayload = decodeURIComponent( atob(base64) .split("") .map(function (c) { return "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2); }) .join("") ); const { exp } = JSON.parse(jsonPayload); const expired = Date.now() >= exp * 1000 return expired }
O más simple
function isTokenExpired(token) { const expiry = (JSON.parse(atob(token.split('.')[1]))).exp; return (Math.floor((new Date).getTime() / 1000)) >= expiry; }
O una sola línea:
const isTokenExpired = token => Date.now() >= (JSON.parse(atob(token.split('.')[1]))).exp * 1000
Nodo.js
function isTokenExpired(token) { const payloadBase64 = token.split('.')[1]; const decodedJson = Buffer.from(payloadBase64, 'base64').toString(); const decoded = JSON.parse(decodedJson) const exp = decoded.exp; const expired = (Date.now() >= exp * 1000) return expired }
O una sola línea:
const isTokenExpired = (token) => (Date.now() >= JSON.parse(Buffer.from(token.split('.')[1], 'base64').toString()).exp * 1000)