Historial de versiones
Cada versión, con qué cambió y por qué. Kotauth sigue el versionado semántico.
Dos archivos compose en la raíz (docker-compose.yml + docker-compose.prod.yml) reemplazan a los seis que vivían en docker/
El overlay de DB externa se reemplaza por DB_URL en .env; el overlay de demo se reemplaza por KAUTH_DEMO_MODE=true en .env
Toda la guía de despliegue se movió a la documentación; se eliminaron los comentarios del Dockerfile, el Caddyfile y los archivos compose
Inyección de secretos basada en archivos (convención *_FILE) para KAUTH_SECRET_KEY, DB_PASSWORD, KAUTH_REDIS_PASSWORD, KAUTH_BOOTSTRAP_ADMIN_PASSWORD y KAUTH_BOOTSTRAP_API_KEYS
Bloqueo de dependencias de Gradle: gradle.lockfile fija el grafo de dependencias resuelto y CI lo verifica en cada PR
Dependabot habilitado para alertas semanales sobre dependencias de Gradle, GitHub Actions e imágenes base de Docker
Cadena HMAC sobre el registro de auditoría: cada fila lleva prev_hash y row_hash mediante HMAC-SHA256 con clave KAUTH_SECRET_KEY; cualquier manipulación o reordenamiento rompe la cadena
El nuevo comando CLI verify-audit-chain detecta filas de auditoría manipuladas o reordenadas
Los detalles del registro de auditoría ahora usan kotlinx.serialization, corrigiendo la corrupción silenciosa de JSON por cadenas concatenadas a mano
Introspección de tokens multi-audiencia: AccessTokenClaims.aud se amplió para admitir el formato de array
Resource Indicators de RFC 8707 para el grant client_credentials: tokens M2M dirigidos por audiencia con aud vinculado al recurso solicitado
Registro de APIs (admin: /settings/apis): CRUD con alcance de workspace para identificadores de audiencia
Pantalla "Authorized APIs" por cliente con autorización mediante casillas y metadatos de Discovery que anuncian resource_indicators_supported: true
Los recursos desconocidos o no autorizados devuelven RFC 8707 invalid_target 400 en lugar de un token silenciosamente amplio
Los 8 tipos de email transaccional ahora están localizados: verificación, magic link, restablecimiento de contraseña, cuenta bloqueada, invitación, contraseña cambiada, prueba de SMTP y OTP
Las plantillas de email se renderizan en el defaultLocale del workspace con fallback al inglés por clave
Proxy de confianza opcional (KAUTH_TRUSTED_PROXY): evita eludir el rate limiting mediante spoofing de cabeceras
Validación del issuer de JWT: los tokens emitidos por un tenant son rechazados por otro
Prevención de open redirect: el redirect_uri posterior al login se valida contra los valores registrados
La comparación del code verifier de PKCE S256 usa igualdad de tiempo constante
La cabecera Server se suprime de las respuestas HTTP
La normalización de errores de login con igualación de tiempos previene la enumeración de usuarios
El contenedor se ejecuta como non-root (UID 10001) con no-new-privileges, cap_drop: ALL y sistema de archivos de solo lectura
Protección contra replay de TOTP: cada código es de un solo uso por enrolamiento; bloqueo tras un número configurable de intentos fallidos
La validación de variables CSS del tema evita la inyección de valores arbitrarios a través de la configuración del workspace
Tiempos de error de login igualados en las rutas de verificación de contraseña y de TOTP
AdminService se dividió en AuthManagementService, UserAdminService y WorkspaceAdminService
UserSelfServiceService se dividió en UserProfileService y UserSecurityService
Se endureció el ratchet de Detekt: reglas de complejidad y acoplamiento aplicadas en CI
BREAKING: Se eliminó la credencial de admin por defecto. Se genera una contraseña aleatoria en el primer arranque y se registra una sola vez en stdout.
BREAKING: El endpoint de refresh token ahora requiere autenticación de cliente (client_id + client_secret para clientes confidenciales)
BREAKING: Los endpoints de introspección y revocación requieren autenticación de cliente según RFC 7662 / RFC 7009
Detección de replay de refresh token con revocación completa de la familia de sesiones al reutilizarse
Bloqueo de cuenta con umbral configurable e interfaz de desbloqueo para administradores
Login con Email OTP alojado: autenticación passwordless de dos pasos en el navegador (ingresa el email, recibe un código de 6 dígitos, inicia sesión)
Conmutador por tenant para Email OTP desde la configuración del workspace
Primitivas de API de administración send-otp / verify-otp para onboarding passwordless programático
Defensa de bloqueo entre desafíos: umbral de intentos de OTP por tenant con respuesta de tiempo constante
Desajuste del prefijo de las API keys bootstrap: kauth_{slug}_ ahora se aplica de forma consistente en la generación y la validación
Validación de redirect URI más estricta: se requiere coincidencia exacta y se rechazan las variantes con barra final
Especificación OpenAPI actualizada con los endpoints de envío/verificación de OTP y la documentación de filtros del registro de auditoría
Los grupos de filtros del registro de auditoría se muestran en la interfaz de administración para una navegación más clara por categoría de evento
Roles por defecto del cliente: roles por aplicación asignados automáticamente a los usuarios que se autorregistran a través de una aplicación OAuth
Tarjeta de "Registration Defaults" en la consola de administración con menú desplegable y tabla de gestión de roles
Protección contra escalada de privilegios entre clientes: los roles de otras aplicaciones no pueden asignarse como predeterminados
Branding de emails transaccionales: nombre de marca, color, URL del logo, email de soporte y nombre de remitente por tenant
Las 8 plantillas de email transaccional heredan automáticamente el branding del workspace
Tarjeta de editor de branding en la configuración del workspace con vista previa en vivo
Impersonación de admin: actúa como cualquier usuario sin conocer su contraseña, con el claim act de RFC 8693 en el token de sesión
Modelo de doble sesión: la sesión del admin permanece activa por debajo de la sesión impersonada
Revocación en cascada: revocar la sesión del admin también termina la sesión impersonada
Servidor MCP nativo de IA (@kotauth/mcp): 33 herramientas en 8 dominios expuestas vía Model Context Protocol
Control de acceso basado en alcances en cada herramienta MCP: la API key otorga solo los permisos que elijas
Conexión con un comando: npx @kotauth/mcp