Saltar al contenido

No se puede configurar Exp e Iat para JWT correctamente

El paso a paso o código que verás en este post es la resolución más rápida y válida que hallamos a esta inquietud o dilema.

Solución:

Este:

new Date().getTime()

darte el tiempo en milisegundos. Pero el tiempo en el token jwt (iat, exp) está en segundos, por lo tanto, tenemos que dividir el resultado por 1000.

var actualTimeInSeconds = new Date().getTime()/1000;

Cómo obtener algo de tiempo en segundos a partir de ahora:

(new Date().getTime() + someTimeInSeconds * 1000)/1000

Si necesita 1 hora a partir de ahora:

(new Date().getTime() + 60 * 60 * 1000)/1000

porque 1h = 60min * 60 s

Y en este momento tiene el tiempo en segundos del token jwt y el tiempo calculado en segundos. Solo debe comparar estos valores.

Precisamente en su situación, debe comparar el tiempo del token jwt con su tiempo real en segundos. Si el tiempo de caducidad del token jwt es mayor que el tiempo real, significa que todavía es válido.
De documentos de jwt token:

El procesamiento de la reclamación de exp requiere que la fecha/hora actual DEBE ser anterior a la fecha/hora de vencimiento indicada en la reclamación de exp.

Editar:

Para obtener la fecha correcta de iat, multiplique el valor por 1000 y agregue al nuevo constructor de fecha:

new Date(iat*1000)

Según lo que publicó Krzysztof Sztompka, pude hacer que Ext mostrara la fecha de vencimiento correcta. (mi requisito original era de 1 hora en el futuro)

Para realizar un seguimiento del cambio frente a los errores anteriores, no actualizaré el código anterior, así que esto es lo que cambié:

var d = new Date();

var calculatedExpiresIn = (((d.getTime()) + (60 * 60 * 1000)) - (d.getTime() - d.getMilliseconds()) / 1000);

var token = jwt.sign("id": user._id, configGeneral.JWT,  expiresIn: calculatedExpiresIn );

Console.log ahora mostrará que Ext es como lo quería, ahora + 1 hora.

Para que el Iat muestre la fecha correcta (después de configurarlo en el sign función y luego la cordura comprobarlo en el decode función), tuve que configurarlo como parte de la carga útil. Tengo mi respuesta aquí

Entonces, finalmente, para que Iat se muestre correctamente, lo agregué a la carga útil como se muestra aquí:

var token = jwt.sign("id": user._id, "iat": (new Date().getTime()), configGeneral.JWT,  expiresIn: calculatedExpiresIn );

Esto da una salida de:

 id: '56253091fe0397c80133f3e4',
  iat: 1445763099706,
  exp: 1445766699705 
Sun Oct 25 2015 11:51:39 GMT+0200 (South Africa Standard Time)
Sun Oct 25 2015 10:51:39 GMT+0200 (South Africa Standard Time)

Este es el JWT sin codificar que devolveré a los usuarios cuando hayan iniciado sesión correctamente y me permitirá verificar si el JWT que tienen que pasar, ya que cada solicitud futura sigue siendo válida y aún no ha caducado.

La época creada por la biblioteca es la época de Unix y puede verificar los valores jwt iat & exp en cualquier sitio web (como este, por ejemplo) & los encontrarás válidos

Por ejemplo, el iat en su pregunta 1445714161 es GMT: sábado 24 de octubre de 2015 19:16:01

Su exp fue 1445717761, que es GMT: sábado, 24 de octubre de 2015 20:16:01

Entonces fue 1 hora más tarde, que era su objetivo desde el principio

si intenta en javascript new Date (1445714161) obtendrá un momento incorrecto

Entonces, la forma más fácil de crear los reclamos iat (creados automáticamente) y exp según la documentación de la biblioteca jsonwebtoken aquí

Puede establecer la caducidad fácilmente de esta manera

jwt.sign(
  data: 'foobar'
, 'secret',  expiresIn: 60 * 60 );

o mejor:

jwt.sign(
  data: 'foobar'
, 'secret',  expiresIn: '1h' );

Esto colocará el reclamo de exp en el jwt de la siguiente manera, con el tiempo de época de Unix correcto tanto para iat como para exp (con vencimiento 1 hora más tarde que el emitido en ese momento), por lo que, por ejemplo, será así (que se puede verificar fácilmente en bibliotecas jwt):


  "data": "foobar",
  "iat": 1539549664,
  "exp": 1539553264

Tenga en cuenta que lo anterior expiresIn La opción es específica para la biblioteca jsonwebtoken y una forma más genérica será así:

jwt.sign(
  exp: Math.floor(Date.now() / 1000) + (60 * 60),
  data: 'foobar'
, 'secret');

Comentarios y valoraciones

Si te gustó nuestro trabajo, puedes dejar una reseña acerca de qué le añadirías a esta sección.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *