Saltar al contenido

Django Rest Framework JWT: cómo cambiar el tiempo de caducidad del token al iniciar sesión

Traemos la mejor respuesta que hemos encontrado por todo internet. Nosotros queremos que te sea útil y si deseas compartir algo que nos pueda ayudar a crecer hazlo con libertad.

Solución:

La actualización del token JWT es un poco confusa, y espero que esta explicación ayude.

  • las fichas tienen un issued at hora (iat en la ficha)
  • las fichas tienen un expiration date (ahora() + 1 hora, por ejemplo)
  • el token no se puede cambiar. El servidor solo puede emitir un nuevo una
  • iat nunca cambia, pero expireslo hace cambiar con cada actualización

Cuando desea extender un token, esto es lo que sucede:

  • envías tu token al punto final del servidor /.../refresh/
  • El servidor comprueba que no haya caducado: now() <= token.iat + JWT_REFRESH_EXPIRATION_DELTA
  • Si no está caducado:
    • emitir un NUEVO token (devuelto en el cuerpo json, igual que el inicio de sesión)
    • El nuevo token es válido para now() + JWT_EXPIRATION_DELTA
    • El issued at valor en la ficha no cambia
    • La aplicación ahora tiene 2 tokens (técnicamente).
    • La aplicación descarta el token anterior y comienza a enviar el nuevo
  • si caducó: mensaje de error de retorno y estado 400

Ejemplo

Tienes EXPIRATION=1 hour, y un REFRESH_DELTA=2 days. Cuando inicia sesión, obtiene un token que dice "creado el: 02 de junio a las 6 p. m.". Puede actualizar este token (o cualquier creado de ella refrescando) durante 2 días. Esto significa, para este inicio de sesión, el tiempo más largo que puede usar un token sin que volver a iniciar sesión, es de 2 días y 1 hora. Podría actualizarlo cada 1 segundo, pero después de 2 días exactamente, el servidor dejaría de permitir la actualización, dejándolo con un token final válido por 1 hora. (duele la cabeza).

Ajustes

Tienes que habilitar esta característica en el backend en el JWT_AUTH settings en su archivo de configuración de django. Creo que está desactivado por defecto. Aquí están las configuraciones que uso:

JWT_AUTH = 
    # how long the original token is valid for
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=2),

    # allow refreshing of tokens
    'JWT_ALLOW_REFRESH': True,

    # this is the maximum time AFTER the token was issued that
    # it can be refreshed.  exprired tokens can't be refreshed.
    'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),

Luego puede llamar a la vista de actualización de JWT, pasar su token en el cuerpo (como json) y recuperar un nuevo token. Los detalles están en los documentos en http://getblimp.github.io/django-rest-framework-jwt/#refresh-token

$ http post localhost:8000/auth/jwt/refresh/ --json token=$TOKEN

que devuelve:

HTTP 200 

    "token": "new jwt token value" 

Si te ha resultado provechoso nuestro post, nos gustaría que lo compartas con el resto desarrolladores y nos ayudes a difundir esta informació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 *