ADR-014 · Consolidación del concepto de usuario · Google-primary + OTP fallback¶
Source:
/srv/projects/cis/cis-plan/DECISIONS.md(do not edit here — re-split desde la fuente)
Fecha: 2026-04-22
Contexto¶
Pre-014: 5 tablas con "users" fragmentados (Authentik × 4 locales). Múltiples sources de truth, join manual por email, sin invite flow, sin canónico.
Decisión¶
- Authentik = fuente de verdad de identidades autenticables.
email.lower()= identificador canónico cross-service.authentik_sub(UUID) = FK binaria entre servicios.- Cada servicio con tabla "users"/"usuarios"/"customers" es una extensión (profile) con FK
authentik_sub. - Contactos / personas / empleados / whatsapp son entidades DIFERENTES (pueden o no tener FK a un user).
- Login prioritario: Google OAuth vía Authentik source Google.
- Login fallback: email + OTP (6 dígitos, 10min TTL, entregado via cis-mailer/Resend SMTP desde
otp@innovacionsantiago.cl). - Password local: deshabilitado para todos excepto grupo
superadmins(emergency access de illanes00 + sopapo). - Provisioning en servicios: JIT (on-demand en OIDC callback), no sync periódico.
- Invite: admin crea user inactive + recovery link via mail.
Consecuencias¶
- 3 schema migrations (cis_admin + cis_platform + cis_inbox).
- Flow Authentik nuevo
cis-primary-authreemplaza default. - Email stage con Resend SMTP conectado.
- Todos los servicios upsert user on callback.
- Invite flow en /usuarios (cis-admin).
Alternativas descartadas¶
- Duplicar users table cross-service (rejected: eternal sync issues).
- Magic link cookie cross-domain (rejected: cookies no funcionan entre subdominios sin shared root).
- Sync periódico Authentik → servicios (rejected: sobra con JIT si el user toca el servicio).