Flujo de token de actualización de JWT

129

Estoy creando una aplicación móvil y estoy usando JWT para la autenticación.

Parece que la mejor manera de hacer esto es emparejar el token de acceso JWT con un token de actualización para que pueda caducar el token de acceso con la frecuencia que desee.

  1. ¿Cómo se ve un token de actualización? ¿Es una cadena aleatoria? ¿Está cifrada esa cadena? ¿Es otro JWT?
  2. El token de actualización se almacenaría en la base de datos en el modelo de usuario para acceder, ¿correcto? Parece que debería estar encriptado en este caso
  3. ¿Enviaría el token de actualización después de un inicio de sesión de usuario y luego haría que el cliente acceda a una ruta separada para recuperar un token de acceso?
jtmarmon
fuente
3
Tenga en cuenta que si está utilizando tokens de actualización, debe proporcionar a los usuarios la capacidad de invalidarlos en la interfaz de usuario. También se recomienda caducarlos automáticamente si no se utilizan, por ejemplo, durante un mes.
Vilmantas Baranauskas
1
@jtmarmon: ¿cómo se almacena el token de actualización en el lado del cliente? Me refiero al dispositivo Android con seguridad.
j10

Respuestas:

39

Suponiendo que se trata de OAuth 2.0, ya que se trata de JWT y tokens de actualización ...:

  1. al igual que un token de acceso, en principio, un token de actualización puede ser cualquier cosa, incluidas todas las opciones que describa; un JWT podría usarse cuando el servidor de autorización quiere ser apátrida o quiere aplicar algún tipo de semántica de "prueba de posesión" al cliente que lo presenta; tenga en cuenta que un token de actualización difiere de un token de acceso en que no se presenta a un servidor de recursos, sino solo al servidor de autorización que lo emitió en primer lugar, por lo que la optimización de validación autónoma para JWTs-as-access-tokens sí no mantener para actualizar tokens

  2. eso depende de la seguridad / acceso de la base de datos; si otras partes / servidores / aplicaciones / usuarios pueden acceder a la base de datos, entonces sí (pero su millaje puede variar según dónde y cómo almacene la clave de cifrado ...)

  3. un servidor de autorización puede emitir tokens de acceso y tokens de actualización al mismo tiempo, según la concesión que utilice el cliente para obtenerlos; la especificación contiene los detalles y las opciones de cada una de las subvenciones estandarizadas

Hans Z.
fuente
31
2. Debe almacenar un hash del token de actualización en su base de datos y luego comparar el hash del token de actualización del usuario con su hash almacenado. La regla de "no almacenar contraseñas de texto sin formato en su base de datos" sigue aquí. Considere un token como una contraseña aleatoria que creó para el usuario.
Rohmer
2
Además, si desea brindar más seguridad, realice también la rotación de tokens de actualización. La importancia de esto ya se menciona en el ITEF RFC 6749 . Si se implementa correctamente, esto también puede ayudar a identificar el escenario de robo del token, es decir, el token de actualización ha sido robado por un atacante. Si está buscando una mejor explicación, diríjase a este enlace
Bhumil Sarvaiya
83

A continuación se muestran los pasos para revocar su token de acceso JWT:

  1. Cuando inicie sesión, envíe 2 tokens (token de acceso, token de actualización) en respuesta al cliente.
  2. El token de acceso tendrá menos tiempo de expiración y Refresh tendrá un tiempo de expiración más largo.
  3. El cliente (Front end) almacenará el token de actualización en su almacenamiento local y el token de acceso en las cookies.
  4. El cliente utilizará un token de acceso para llamar a las API. Pero cuando expire, elija el token de actualización del almacenamiento local y llame a la API del servidor de autenticación para obtener el nuevo token.
  5. Su servidor de autenticación tendrá una API expuesta que aceptará el token de actualización y verificará su validez y devolverá un nuevo token de acceso.
  6. Una vez que expire el token de actualización, se cerrará la sesión del usuario.

Por favor, avíseme si necesita más detalles, también puedo compartir el código (Java + Spring boot).

Para sus preguntas:

P1: Es otro JWT con menos reclamos presentados con un largo tiempo de vencimiento.

P2: No estará en una base de datos. El backend no se almacenará en ningún lado. Simplemente descifrarán el token con una clave privada / pública y también lo validarán con su tiempo de caducidad.

P3: Sí, correcto

Bhupinder Singh
fuente
28
Creo que el JWT debe almacenarse localStoragey refreshTokendebe almacenarse en un archivo httpOnly. Se refreshToeknpuede usar para obtener un nuevo JWT, por lo que debe manejarse con mayor precaución.
Tnc Andrei
2
Gracias, ¿qué quieres decir con almacenar en httpOnly? ¿Por qué no almacenar ambos en localStorage?
Jay
8
Me estoy perdiendo los beneficios de usar el token de actualización, ¿no sería lo mismo extender la validez del token de acceso?
user2010955
3
@Jay De acuerdo con Microsoft Developer Network, HttpOnly es una marca adicional incluida en un encabezado de respuesta HTTP Set-Cookie. El uso de la marca HttpOnly al generar una cookie ayuda a mitigar el riesgo de que el script del lado del cliente acceda a la cookie protegida (si el navegador lo admite).
shadow0359
23
# 2 es muy inexacto. Un token de actualización TIENE que almacenarse en el lado del servidor. No debe aprovechar la propiedad "autónoma" de JWT para un token de actualización. Si lo hace, no tendrá otra forma de revocar los tokens de actualización que no sea cambiar su clave privada.
Jai Sharma
26

Basado en esta implementación con Node.js de JWT con token de actualización :

1) En este caso usan un uid y no es un JWT. Cuando actualizan el token, envían el token de actualización y al usuario. Si lo implementa como un JWT, no necesita enviar el usuario, porque lo haría dentro del JWT.

2) Implementan esto en un documento separado (tabla). Para mí tiene sentido porque un usuario puede iniciar sesión en diferentes aplicaciones cliente y podría tener un token de actualización por aplicación. Si el usuario pierde un dispositivo con una aplicación instalada, el token de actualización de ese dispositivo podría invalidarse sin afectar a los otros dispositivos conectados.

3) En esta implementación, responde al método de inicio de sesión con token de acceso y token de actualización. Me parece correcto.

David
fuente
Al decir "1) En este caso usan un uid ..." ¿te refieres al UUID?
ozanmuyes
¿Qué pasa con esta implementación más simple? Emitir JWT - envíe el JWT anterior cuando desee actualizar - (puede verificar iatcon la ventana)
vuelva a
@adonese enviando solo el que JWTquieres tener refresh_tokendentro? Si es así, OAuth RFC 6749 dice explícitamente que no se envíe refresh_tokenal servidor de recursos (y JWTse envía a los servidores de recursos): tools.ietf.org/html/rfc6749#section-1.5
Brenno Costa