Claims JWT Personalizados
Los claims personalizados te permiten incrustar datos adicionales directamente en el JWT de acceso emitido por Auris. En lugar de hacer una llamada API adicional para obtener datos del usuario después de la autenticación, tu backend puede leer el claim directamente desde el token verificado.
Los claims personalizados se configuran por aplicación en la Consola y se resuelven en el momento de la emisión del token.
Cuándo Usar Claims Personalizados
Los claims personalizados son útiles cuando:
- Tu backend necesita metadatos del usuario (departamento, plan, ID de tenant) en cada solicitud sin una consulta adicional
- Una API de terceros espera claims específicos en el JWT (por ejemplo, una pasarela de pago que espera un claim
subscription_tier) - Quieres codificar información de permisos o roles en el token para autorización sin estado
- Diferentes aplicaciones en tu tenant necesitan datos de usuario distintos en sus tokens
Los claims en los access tokens son legibles por cualquiera que tenga el token. No incrustes datos sensibles (contraseñas, secretos, datos financieros) en los claims JWT. Los claims también se incluyen en el tamaño del token — cargas útiles grandes aumentan el tamaño de cada cabecera HTTP Authorization.
Tipos de Claim
Auris soporta cuatro tipos de valor para los claims:
STATIC
Un valor fijo de tipo string, número o booleano — el mismo para todos los usuarios que reciben un token de esta aplicación.
{ "environment": "production" }
{ "app_version": "2.1.0" }
{ "feature_flag_x": true }Úsalo cuando: Necesitas identificar qué aplicación emitió el token, o incrustar valores de configuración que no cambian por usuario.
USER_ATTRIBUTE
Un valor extraído del perfil del usuario autenticado. Los atributos disponibles son:
| Clave de Atributo | Descripción |
|---|---|
email | Dirección de email principal del usuario |
firstName | Nombre del usuario |
lastName | Apellido del usuario |
username | Nombre de usuario (username de Keycloak) |
phoneNumber | Número de teléfono verificado del usuario |
metadata | El objeto JSON completo de metadatos del usuario |
metadata.{key} | Una clave específica del objeto JSON de metadatos del usuario |
{ "user_email": "[email protected]" }
{ "department": "engineering" } // via metadata.department
{ "phone": "+15551234567" }Úsalo cuando: Tu backend o servicio downstream necesita datos de identidad del usuario disponibles en el token sin llamadas API adicionales.
ROLE_BASED
Un valor diferente devuelto según qué roles tiene el usuario. Gana la primera coincidencia de rol. Se devuelve un valor de fallback si no coincide ningún rol.
// Configuración:
{
"plan": {
"Administrator": "enterprise",
"Pro User": "pro",
"default": "free"
}
}
// Claim resultante para un Pro User: { "plan": "pro" }
// Claim resultante para un Administrator: { "plan": "enterprise" }
// Claim resultante para un usuario sin rol coincidente: { "plan": "free" }Úsalo cuando: Diferentes roles en tu sistema corresponden a niveles de funcionalidades, niveles de acceso o planes de precios sobre los que los servicios downstream necesitan actuar.
EXPRESSION
Un valor calculado usando una expresión simple evaluada contra el contexto del usuario. Las expresiones tienen acceso a las variables user, roles y metadata.
// Las expresiones son similares a JavaScript (evaluadas en un contexto aislado)
user.email.split('@')[1] // => "acme.com" (dominio del email)
roles.includes('Administrator') // => true | false
metadata.orgId ?? 'default' // => orgId de los metadatos o "default"
user.firstName + ' ' + user.lastName // => "Alice Smith"Las expresiones se evalúan en un contexto aislado. No tienen acceso a require, import, process, eval, llamadas de red ni operaciones del sistema de archivos.
Úsalo cuando: Necesitas un valor derivado o calculado que no está disponible directamente como atributo de usuario.
Claims Reservados
Las siguientes claves de claim están reservadas por Auris y por la especificación OAuth2/OIDC. No pueden ser anuladas por claims personalizados:
| Claim Reservado | Descripción |
|---|---|
iss | Emisor del token (tu dominio de Auris) |
sub | Sujeto — el ID del usuario |
aud | Audiencia — tu client ID |
exp | Marca de tiempo de expiración |
iat | Marca de tiempo de emisión |
jti | ID del JWT (identificador único del token) |
type | Tipo de token (user o m2m) |
scope | Scopes OAuth concedidos |
roles | Array con los nombres de roles del usuario |
email | Email del usuario (de los claims OIDC estándar) |
name | Nombre de visualización del usuario |
Intentar crear un claim personalizado con una clave reservada devuelve un error de validación.
Configuración en la Consola
Abrir la configuración de Claims Personalizados
En la Consola de Auris, navega a Aplicaciones → selecciona tu aplicación → pestaña Claims Personalizados.
Añadir un claim
Haz clic en Añadir Claim y configura:
- Clave del Claim: La clave JSON en el token (ej.
department,plan,tenant_id) - Tipo de Claim: STATIC, USER_ATTRIBUTE, ROLE_BASED o EXPRESSION
- Valor: Configuración de valor específica según el tipo
Previsualizar el claim
Usa el botón Vista Previa para resolver el claim para un usuario específico antes de guardar. Esto llama al endpoint API de vista previa con los datos reales del usuario.
Activar el claim
Activa Activo en el claim. Los claims desactivados se omiten durante la emisión del token (útil para probar sin eliminar la configuración).
Ejemplos
Ejemplo 1: Incrustar el Departamento del Usuario
Requisito: Tu backend necesita conocer el departamento del usuario en cada solicitud.
Configuración:
- Clave del Claim:
department - Tipo:
USER_ATTRIBUTE - Atributo:
metadata.department
Token resultante:
{
"sub": "user-id-123",
"email": "[email protected]",
"roles": ["Employee"],
"department": "Engineering",
...claims estándar...
}Uso en el backend:
// Sin llamada API adicional — el departamento está en el token
const { department } = verifyToken(req.headers.authorization.slice(7))
console.log(department) // "Engineering"Ejemplo 2: Insignia de Plan de Suscripción
Requisito: Una herramienta de análisis de terceros espera un claim subscription_plan que indique el nivel del usuario.
Configuración:
- Clave del Claim:
subscription_plan - Tipo:
ROLE_BASED - Mapeo:
Enterprise Customer→enterprisePro Customer→proFree Tier→free- Predeterminado →
free
Token resultante para un Enterprise Customer:
{
"sub": "user-id-456",
"roles": ["Enterprise Customer", "Invoice Viewer"],
"subscription_plan": "enterprise",
...
}Ejemplo 3: Extracción del Dominio de Email
Requisito: Un backend multi-tenant enruta las solicitudes según el dominio de email del usuario (empresa).
Configuración:
- Clave del Claim:
email_domain - Tipo:
EXPRESSION - Expresión:
user.email.split('@')[1]
Token resultante:
{
"sub": "user-id-789",
"email": "[email protected]",
"email_domain": "contoso.com",
...
}Ejemplo 4: Entorno de Aplicación Estático
Requisito: Distinguir los tokens de los registros de aplicaciones de producción frente a los de staging.
Configuración (en la app de producción):
- Clave del Claim:
env - Tipo:
STATIC - Valor:
production
Configuración (en la app de staging):
- Clave del Claim:
env - Tipo:
STATIC - Valor:
staging
Endpoints de la API
/api/applications/:id/custom-claimsRequires: view:applicationsLista todos los claims personalizados configurados para una aplicación, incluyendo su tipo, configuración de valor y estado activo.
/api/applications/:id/custom-claimsRequires: manage:applicationsCrea un nuevo claim personalizado. Cuerpo: { claimKey: string, valueType: 'STATIC' | 'USER_ATTRIBUTE' | 'ROLE_BASED' | 'EXPRESSION', staticValue?: string, userAttribute?: string, roleMapping?: Record<string, string>, expression?: string, isActive?: boolean }.
/api/applications/:id/custom-claims/:claimIdRequires: manage:applicationsActualiza la configuración o el estado activo de un claim personalizado.
/api/applications/:id/custom-claims/:claimIdRequires: manage:applicationsElimina un claim personalizado. Los tokens emitidos después de la eliminación no contendrán el claim. Los tokens emitidos antes de la eliminación permanecen sin cambios hasta que expiren.
/api/applications/:id/custom-claims/previewRequires: view:applicationsPrevisualiza la resolución del claim para un usuario específico. Cuerpo: { userId: string }. Devuelve los valores del claim resueltos tal como aparecerían en un token para ese usuario.
Consideraciones sobre el Tamaño del Token
Cada claim personalizado aumenta el tamaño de cada JWT de acceso emitido por la aplicación. Los tokens JWT se envían como cabeceras HTTP en cada solicitud autenticada. Mantén los claims concisos:
| Consideración | Recomendación |
|---|---|
| Valores de string | Mantener por debajo de 100 caracteres por claim |
| Evitar objetos de metadatos completos | Usa metadata.{key} para extraer campos específicos, no el objeto metadata completo |
| Número de claims | Apunta a menos de 10 claims personalizados por aplicación |
| Valores de claim basados en rol | Usa identificadores cortos (pro, free) no descripciones completas |
Los tokens demasiado grandes pueden causar errores 431 Request Header Fields Too Large en algunos proxies y balanceadores de carga (típicamente con cabeceras superiores a 8KB).
Guías Relacionadas
- Roles y Permisos (RBAC) — Configuración de roles referenciada por los claims ROLE_BASED
- Autorización de Grano Fino — Autorización a nivel de objeto usando FGA
- Credenciales M2M (Client Credentials) — Los claims personalizados también se aplican a los tokens M2M