- Mantenlo en secreto. Mantenlo a salvo: La clave de firma debe tratarse como cualquier otra credencial y revelarse solo a los servicios que la necesiten.
- No agregues datos sensibles al payload: Los tokens se firman para protegerlos contra manipulaciones y se pueden decodificar fácilmente. Agrega al payload la cantidad mínima indispensable de claims para obtener el mejor rendimiento y seguridad.
- Asigna una expiración a los tokens: Técnicamente, una vez que un token está firmado, es válido para siempre, a menos que se cambie la clave de firma o se establezca explícitamente una expiración. Esto podría generar problemas, así que ten una estrategia para hacer que los tokens expiren y/o revocarlos.
- Usa HTTPS: No envíes tokens a través de conexiones que no usen HTTPS, ya que esas solicitudes pueden ser interceptadas y los tokens verse comprometidos.
- Considera todos tus casos de uso de autorización: Puede ser necesario agregar un sistema secundario de verificación de tokens que garantice que los tokens fueron generados por tu servidor para cumplir con tus requisitos.
- Almacena y reutiliza: Reduce los viajes de ida y vuelta innecesarios que amplían la superficie de ataque de tu aplicación y optimiza los límites de tokens de tu plan (cuando corresponda) almacenando obtenidos del . En lugar de solicitar un token nuevo, usa el token almacenado en futuras llamadas hasta que expire. La forma en que almacenes los tokens dependerá de las características de tu aplicación: las soluciones típicas incluyen bases de datos (para aplicaciones que necesitan realizar llamadas a la API independientemente de si hay una sesión activa) y sesiones HTTP (para aplicaciones cuya ventana de actividad se limita a una sesión interactiva). Para ver un ejemplo de almacenamiento del lado del servidor y reutilización de tokens, consulta Almacenamiento de tokens.
Authorization de cada solicitud posterior a tu API. Lo ideal es que ese token sea un estándar, como , ya que encontrarás bibliotecas en la mayoría de las plataformas y no querrás implementar tu propia criptografía.
Con ambos enfoques, puedes obtener la misma cantidad de información del usuario. Esto se controla mediante el parámetro scope enviado en la solicitud de inicio de sesión (ya sea usando Lock, nuestra biblioteca de JavaScript, o un enlace simple). scope es un parámetro del método .signin({scope: 'openid name email'}) que termina formando parte de la cadena de consulta en la solicitud de inicio de sesión.
De forma predeterminada, usamos scope=openid en la autenticación basada en tokens para evitar que el token sea demasiado grande. Puedes controlar qué reclamaciones estándar de Connect (OIDC) quieres obtener en el token añadiéndolas como valores de scope. Por ejemplo, scope=openid name email family_name address phone_number. Para obtener más información, consulta Standard Claims on openid.net.
Puedes combinar la autenticación basada en tokens con la autenticación basada en cookies. Ten en cuenta que las cookies funcionarán perfectamente si la aplicación web y la API se sirven desde el mismo dominio, por lo que quizá no necesites autenticación basada en tokens. Si la necesitas, también devolvemos un JWT en el flujo de la aplicación web. Cada uno de nuestros SDK lo hace de forma diferente. Si quieres llamar a tus API desde JavaScript (en lugar de usar la cookie existente), entonces tienes que configurar los tokens de acceso usando Web Workers o cierres de JavaScript para gestionar la transmisión y el almacenamiento de tokens. Para obtener más información, lee la sección Browser in-memory scenarios de nuestra página de Almacenamiento de tokens.
Uso del token de actualización
- Flujo de código de autorización
- Flujo de código de autorización con Proof Key for Code Exchange (PKCE)
- Flujo de contraseña del propietario del recurso
- Flujo de autorización de dispositivo
offline_access en tu solicitud).
Las Rules se ejecutan durante el intercambio del token de actualización. Para aplicar lógica especial, puedes revisar la propiedad context.protocol en tu rule. Si el valor es oauth2-refresh-token, significa que la rule se está ejecutando durante el intercambio.
Al intentar obtener un token de actualización, el parámetro no está disponible en el objeto de contexto de Rules. Si recibes un error al intentar agregar el parámetro audience, verifica que no esté configurado en el token.
Si intentas redirigir con context.redirect, el flujo de autenticación devolverá un error.
Si has agregado custom claims a tus tokens mediante una rule, esas custom claims aparecerán en los nuevos tokens emitidos al usar un token de actualización mientras la rule siga activa. Aunque los nuevos tokens no heredan automáticamente las custom claims, las rules se ejecutan durante el flujo de token de actualización, por lo que se ejecutará el mismo código. Esto te permite agregar o cambiar custom claims en tokens recién emitidos sin obligar a las aplicaciones autorizadas previamente a obtener un nuevo token de actualización.
Límites de los tokens de actualización
Pruebas automatizadas
- Cree un usuario con Management API. Usará este usuario para las pruebas.
- La respuesta devuelve un
user_idque debe conservar durante las pruebas para usarlo más adelante. - Una vez finalizadas las pruebas, elimine el usuario mediante Management API. Cuando se elimina el usuario de prueba, también se eliminan los elementos asociados, incluidos los tokens de actualización.
- Liste los tokens de actualización del usuario mediante el endpoint de credenciales de dispositivo de Management API. El endpoint devolverá un máximo de 1000 tokens sin un orden específico, independientemente de la cantidad de tokens acumulados o del uso de paginación.
- Elimine esas credenciales con el método DELETE.
- Si el usuario tiene más de 1k tokens, repita el proceso de listar y eliminar tokens hasta que no queden más tokens para el usuario.
Configurar tokens de actualización con caducidad
offline_access en la solicitud de autorización, se les emite un nuevo token de actualización. Si los usuarios cierran sesión y vuelven a iniciarla en el mismo dispositivo, se emite un nuevo token de actualización. Según cómo su aplicación almacene y utilice los tokens de actualización, el token de actualización anterior del primer inicio de sesión podría quedar obsoleto, y lo más probable es que su aplicación utilice los nuevos tokens de actualización si ambos se emiten con la misma audiencia. Para obtener más información, consulte Almacenamiento de tokens.
Para evitar acumular tokens de actualización obsoletos, aunque el límite de tokens de actualización elimina primero el token más antiguo, le recomendamos configurar la caducidad de los tokens de actualización. Tanto los tokens de actualización rotativos como los no rotativos (o reutilizables) pueden configurarse para caducar con valores de expiración por inactividad o absoluta. Ambos valores de expiración ayudan a eliminar los tokens que no están en uso activo y a evitar que se acumulen tokens para el usuario. Para obtener más información, consulte Configure Refresh Token Expiration.
Validación de JWT
Algoritmos de firma
- RS256 (RSA Signature with SHA-256): Un algoritmo asimétrico, lo que significa que hay dos claves: una clave pública y una clave privada que debe mantenerse en secreto. Auth0 tiene la clave privada utilizada para generar la firma, y el consumidor del JWT obtiene una clave pública desde los endpoints de metadatos proporcionados por Auth0 y la utiliza para validar la firma del JWT.
- HS256 (HMAC with SHA-256): Un algoritmo simétrico, lo que significa que solo hay una clave privada que debe mantenerse en secreto y que se comparte entre ambas partes. Dado que la misma clave se utiliza tanto para generar la firma como para validarla, se debe tener cuidado para asegurarse de que la clave no se vea comprometida. Esta clave privada (o secreto) se crea cuando registras tu Application () o API (Signing Secret) y eliges el algoritmo de firma HS256.
- Con RS256, tienes la certeza de que solo quien posee la clave privada (Auth0) puede firmar tokens, mientras que cualquiera puede comprobar si el token es válido usando la clave pública.
- Con RS256, puedes solicitar un token válido para múltiples audiencias.
- Con RS256, si la clave privada se ve comprometida, puedes implementar la rotación de claves sin tener que volver a desplegar tu aplicación o API con el nuevo secreto (lo cual tendrías que hacer si usaras HS256).
- Con HS256, si la clave secreta se ve comprometida, tendrías que volver a desplegar la API con el nuevo secreto.