Saltar a contenido

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-auth reemplaza 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).