
🔐 Aprende autenticación construyéndola correctamente. Una implementación de referencia extensible y compatible con estándares para Cloudflare Workers con Hono, Turso, PBKDF2 y sesiones de doble token JWT.
Aprende autenticación construyéndola correctamente.
Demo en vivo · Modelo de amenazas · Flujos de autenticación · ADRs
Nota de la demo: El endpoint de inicio de sesión está protegido por desafíos PoW adaptativos — los fallos repetidos devuelven una dificultad de prueba de trabajo creciente. La limitación de velocidad con respaldo de caché está implementada y probada, pero actualmente no está habilitada en la demo en vivo; cambia
createCacheClientenapp.tspara activarla.
Una implementación de referencia de autenticación desde cero para Cloudflare Workers — hashing de contraseñas PBKDF2, sesiones de tokens duales JWT, comparación en tiempo constante, expiración deslizante y un plugin de observabilidad removible — todo conectado con Hono, Turso (con almacenamiento en caché opcional Valkey/Redis) y TypeScript estricto.
Cada decisión de diseño se remonta a un estándar: NIST SP 800-63B para credenciales, NIST SP 800-132 para derivación de claves, OWASP ASVS para verificación y RFC 8725 para mejores prácticas de JWT.
¿Lanzando un producto? Usa Better Auth en su lugar — cubre OAuth, passkeys, MFA, limitación de velocidad y más de fábrica con un ecosistema de plugins activo. Este repositorio existe para enseñarte cómo funciona la autenticación, no para reemplazar una librería de producción.
Este proyecto omite intencionalmente características que están fuera de su alcance educativo. Si estás extendiendo este código hacia producción (o evaluando lo que requiere un sistema de autenticación de producción), las tablas a continuación organizan las brechas por nivel de prioridad.
Para la mayoría de proyectos reales, usa Better Auth en lugar de construir esto tú mismo.
| Característica | Por qué es importante | Estándar / Referencia |
|---|---|---|
| Verificación de contraseñas filtradas | Previene el uso de contraseñas que se sabe están en filtraciones públicas | NIST SP 800-63B §5.1.1.2, API de HIBP |
Todas estas son excelentes razones para optar por Better Auth en su lugar.
.
├── apps/
│ └── cloudflare-workers/ # Worker de ejemplo + rutas de Hono
├── packages/
│ ├── core/ # Servicios de autenticación, middleware, utilidades criptográficas
│ ├── infrastructure/ # Cliente de base de datos + utilidades
│ ├── observability/ # Emisión de eventos, desafíos adaptativos, API de operaciones (plugin removible)
│ ├── schemas/ # Esquemas Zod
│ └── types/ # Tipos TypeScript compartidos
├── tools/
│ └── cli/ # plctl — TUI en Go para la superficie /ops
└── docs/
├── adr/ # Registros de decisiones de arquitectura
└── audits/ # Auditorías de seguridad
git clone https://github.com/vhscom/private-landing.git
cd private-landing
bun install
bun run dev
Eso es todo — sin cuentas, sin claves API, sin archivos .env. El servidor de desarrollo se inicia con una base de datos SQLite local y secretos generados. Abre http://localhost:8788 para registrar una cuenta y explorar los flujos de autenticación.
¿Tienes una cuenta de Turso? Coloca un archivo
.dev.varsenapps/cloudflare-workers/(consulta.dev.vars.example) ybun run devusará automáticamente wrangler con tu base de datos remota en su lugar. Usabun run dev:localpara forzar el servidor local independientemente.
Consulta CONTRIBUTING.md para instrucciones de prueba e implementación.
Este repositorio incluye un archivo CLAUDE.md que proporciona contexto para asistentes de IA. Al usar Claude Code, Cursor o herramientas de desarrollo similares potenciadas por IA:
CLAUDE.md para el contexto del proyectodocs/adr/ explican las elecciones de diseñodocs/audits/ documentan la postura de seguridadLa base de código está diseñada para ser legible por IA con límites de módulo claros, tipos completos y nombres descriptivos.
| Capa | Qué hace |
|---|
| Almacenamiento de contraseñas | PBKDF2-SHA384 con sales de 128 bits, resumen de integridad, seguimiento de versión (password-service.ts) |
| Gestión de sesiones | Sesiones del lado del servidor con seguimiento de dispositivo, expiración deslizante, límite máximo de 3 por usuario; sesiones opcionales con respaldo de caché a través de Valkey/Redis (session-service.ts, cached-session-service.ts) |
| Cambio de contraseña | Re-verificación de contraseña actual, nuevo hash PBKDF2 completo, revocación atómica de todas las sesiones (account-service.ts, ADR-004) |
| Patrón de tokens duales JWT | Token de acceso de 15 min + token de actualización de 7 días, vinculado a la sesión para revocación (token-service.ts) |
| Middleware de autenticación | Flujo de actualización automática, fijación explícita de HS256, validación de la reclamación typ (require-auth.ts) |
| Cookies seguras | HttpOnly, Secure, SameSite=Strict, Path=/ (cookie.ts) |
| Cabeceras de seguridad | HSTS, CSP, CORP/COEP/COOP, Permissions-Policy, eliminación de huellas digitales (security.ts) |
| Validación de entrada | Esquemas Zod con política de contraseñas conforme a NIST (solo longitud, sin reglas de complejidad) |
| Limitación de velocidad | Aceleración de ventana fija contra ataques de fuerza bruta y relleno de credenciales: por IP en rutas de autenticación públicas (ej. inicio de sesión), por usuario en acciones protegidas; sin bloqueos duros (alineado con NIST) (ADR-006) |
| Plugin de observabilidad | Eventos de seguridad estructurados, desafíos PoW adaptativos, API /ops autenticada por agente — se conecta mediante middleware, removible eliminando un paquete (ADR-008) |
| Herramientas CLI | TUI en Go (plctl) para consultar eventos, gestionar sesiones y aprovisionar credenciales de agente a través de la superficie /ops (tools/cli/) |
| Pruebas de vectores de ataque | Manipulación de JWT, confusión de algoritmos, confusión de tipos, casos límite de Unicode, comprobaciones de divulgación de información |
| Característica | Por qué es importante | Estándar / Referencia |
|---|
| Protección CSRF (si se relaja SameSite) | SameSite=Strict actualmente previene CSRF; si se cambia a Lax por UX, se necesita un token explícito | Hoja de referencia de CSRF de OWASP |
| Rotación de token de actualización | Detecta robo de token — si un token de actualización rotado se reutiliza, revoca toda la familia de sesiones | RFC 6819 §5.2.2.3 |
Reclamación aud en JWT | Evita que un token de un servicio sea aceptado por otro que comparta el mismo secreto | RFC 7519 §4.1.3, RFC 8725 §3.9 |
| Nonces CSP para scripts en línea | CSP actual usa 'unsafe-inline'; los nonces eliminan vectores XSS de scripts en línea | MDN CSP script-src |
| Característica | Por qué es importante | Estándar / Referencia |
|---|
| Autenticación multifactor TOTP | Añade un segundo factor para cuentas de alto valor | RFC 6238, NIST SP 800-63B §5.1.4 |
| WebAuthn / passkeys | Autenticación resistente al phishing usando autenticadores de plataforma | WebAuthn Level 2 |
| OAuth / inicio de sesión social | Reduce fricción, evita fatiga de contraseñas | RFC 6749 |
| Magic links / OTP | Opción sin contraseña para flujos de bajo riesgo | NIST SP 800-63B §5.1.3 |
| Analítica de sesiones | Seguimiento de dispositivos, visibilidad de sesiones concurrentes, detección de anomalías | Hoja de referencia de gestión de sesiones de OWASP |
| Rotación de claves de firma | Permite rotación periódica de secretos sin invalidar todas las sesiones | RFC 7517 (JWK) |
| Característica | Por qué es importante | Estándar / Referencia |
|---|
| DPoP / vinculación de token | Vincula tokens a la conexión TLS del cliente, evitando la reproducción por exfiltración | RFC 9449 (DPoP) |
| Multi-tenencia | Aísla grupos de usuarios, secretos y políticas por inquilino | Específico de la aplicación |
| Geo-cercado / reputación IP | Bloquea inicios de sesión desde regiones inesperadas o IPs conocidas como maliciosas | OWASP ASVS v5.0 §6.3.5 |
| Autenticación adaptativa | Aumenta los requisitos de autenticación basados en señales de riesgo (dispositivo, ubicación, comportamiento) | NIST SP 800-63B §6 |
| Actualización de iteraciones PBKDF2 o Argon2id | OWASP recomienda 210.000 iteraciones de PBKDF2-SHA512 (Cloudflare limita a 100k); Argon2id es resistente a memoria | Hoja de referencia de almacenamiento de contraseñas de OWASP |