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, peroexpires
lo 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.