Skip to Content

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 AtributoDescripción
emailDirección de email principal del usuario
firstNameNombre del usuario
lastNameApellido del usuario
usernameNombre de usuario (username de Keycloak)
phoneNumberNúmero de teléfono verificado del usuario
metadataEl 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 ReservadoDescripción
issEmisor del token (tu dominio de Auris)
subSujeto — el ID del usuario
audAudiencia — tu client ID
expMarca de tiempo de expiración
iatMarca de tiempo de emisión
jtiID del JWT (identificador único del token)
typeTipo de token (user o m2m)
scopeScopes OAuth concedidos
rolesArray con los nombres de roles del usuario
emailEmail del usuario (de los claims OIDC estándar)
nameNombre 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 → enterprise
    • Pro Customer → pro
    • Free 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

GET/api/applications/:id/custom-claimsRequires: view:applications

Lista todos los claims personalizados configurados para una aplicación, incluyendo su tipo, configuración de valor y estado activo.

POST/api/applications/:id/custom-claimsRequires: manage:applications

Crea 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 }.

PATCH/api/applications/:id/custom-claims/:claimIdRequires: manage:applications

Actualiza la configuración o el estado activo de un claim personalizado.

DELETE/api/applications/:id/custom-claims/:claimIdRequires: manage:applications

Elimina 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.

POST/api/applications/:id/custom-claims/previewRequires: view:applications

Previsualiza 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ónRecomendación
Valores de stringMantener por debajo de 100 caracteres por claim
Evitar objetos de metadatos completosUsa metadata.{key} para extraer campos específicos, no el objeto metadata completo
Número de claimsApunta a menos de 10 claims personalizados por aplicación
Valores de claim basados en rolUsa 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