Aplicación Next.js para gestionar intentos de reseteo de contraseña con verificación de usuario, logging de intentos y base de datos en Neon/Postgres. Incluye APIs para verificación y registro de intentos, middleware de seguridad, y scripts para inicializar y seedear la base de datos.
- Introducción
- Stack y Estructura
- Requisitos
- Variables de Entorno
- Configuración de Base de Datos (Neon)
- Scripts Disponibles
- Desarrollo Local
- Endpoints de API
- Middleware y Seguridad
- Flujo de Reseteo
- Resolución de Problemas
- Roadmap breve
Este proyecto provee una UI simple para ingresar un identificador de usuario (por ejemplo email o username), validarlo contra una base de datos en Neon, y registrar cada intento de reseteo. Pensado para integrarse con flujos corporativos (Microsoft/SSO) o como base para un sistema propio.
- Next.js 14 (App Router)
- TypeScript + Tailwind
- Postgres en Neon (serverless)
- Librería de componentes UI (shadcn/ui)
Estructura relevante:
app/
páginas, layout y rutas de API (app/api/*
)components/
UI y formularios (password-reset-form.tsx
,microsoft-reset-form.tsx
,db-status-indicator.tsx
)lib/
utilidades (db.ts
,validation.ts
)scripts/
utilidades Node para Neon (check-neon.js
,init-neon.js
,seed-neon.js
,seed-attempts.js
)sql/
definiciones SQL (init_neon.sql
)public/
assets
- Node.js 18+ (se recomienda 18 LTS o 20 LTS)
- npm o pnpm (el repo incluye
package-lock.json
para npm) - Cuenta y base de datos en Neon (Postgres)
Crea tu .env.local
en base a .env.example
.
Claves típicas:
DATABASE_URL
: cadena de conexión de Neon (formatopostgres://user:pass@host/db?sslmode=require
)NEXT_PUBLIC_APP_NAME
: nombre mostrado en la UI- Otras claves opcionales para logs o proveedores (según tu integración)
Notas:
.env*
está ignorado por git (.gitignore). No subas credenciales.- Si usas Vercel u otro PaaS, define estas variables en su panel.
- Crea el proyecto y DB en https://neon.tech
- Obtén la
DATABASE_URL
con SSL habilitado. - Inicializa el esquema:
npm run db:init
(usasql/init_neon.sql
)
- Opcional: poblar datos de prueba
npm run db:seed
- Verifica conexión:
npm run db:check
Los scripts usan la DATABASE_URL
de tu entorno (.env.local
).
Desde package.json
:
dev
: inicia Next en modo desarrollobuild
: compila la appstart
: ejecuta producciónlint
: corre linter (si está configurado)db:check
: verifica conexión a Neon (scripts/check-neon.js
)db:init
: aplica el esquema inicial (sql/init_neon.sql
viascripts/init-neon.js
)db:seed
: datos base de usuarios/reset attempts (scripts/seed-neon.js
y/oscripts/seed-attempts.js
)
Ejemplos:
npm install
npm run db:check
npm run db:init
npm run db:seed
npm run dev
- Instala dependencias:
npm install
- Configura
.env.local
- Inicializa base de datos (sección Neon)
- Levanta el entorno:
npm run dev
La app correrá en http://localhost:3000
.
Rutas en app/api/*
:
-
GET /api/check-db-connection
- Verifica conectividad a la DB. Útil para health checks y UI de estado (
db-status-indicator
).
- Verifica conectividad a la DB. Útil para health checks y UI de estado (
-
POST /api/verify-user
- Body:
{ identifier: string }
(email/username según tu modelo) - Respuesta: detalles mínimos del usuario o estado de validación.
- Usa validaciones de
lib/validation.ts
y consultas enlib/db.ts
.
- Body:
-
POST /api/log-reset-attempt
- Body:
{ identifier: string, status: 'success'|'fail', reason?: string }
- Persiste cada intento en tabla de auditoría.
- Body:
-
POST /api/init-neon
- Inicialización controlada del esquema (según permisos/config). Úsalo sólo en entornos de desarrollo o protegidos.
Nota: Los nombres exactos de campos pueden variar con tu esquema. Revisa sql/init_neon.sql
y lib/db.ts
para detalles.
middleware.ts
: puede manejar rate limiting básico, protección de rutas o encabezados de seguridad.- Envía sólo información mínima al cliente; los endpoints deberían validar input y no filtrar datos sensibles.
- Usa SSL en Neon (
sslmode=require
) y en despliegue. - Considera añadir:
- Rate limiting por IP/identificador en
log-reset-attempt
- Captcha/turnstile para mitigar abuso
- Logs estructurados y alertas
- Rate limiting por IP/identificador en
- Usuario ingresa identificador en
password-reset-form.tsx
o flujo Microsoft. - Frontend llama
POST /api/verify-user
. - Si existe/permite reset, se registra intento via
POST /api/log-reset-attempt
. - (Extensión) Enviar correo con token/OTP o redirigir a proveedor externo.
Componentes clave:
components/password-reset-form.tsx
: UI principal de reseteo.components/microsoft-reset-form.tsx
: variante para flujos Microsoft/SSO.components/db-status-indicator.tsx
: muestra salud de DB consultando/api/check-db-connection
.
- Error de conexión a DB: revisa
DATABASE_URL
y quesslmode=require
esté presente para Neon. - Migraciones/SQL fallan: asegúrate de correr
npm run db:init
con la URL correcta. - 403 al hacer push a GitHub: verifica SSH o usa HTTPS+PAT.
- Variables no disponibles: en Next.js, las variables que necesitas en el cliente deben iniciar con
NEXT_PUBLIC_
.
- Añadir tokens de reseteo con expiración y almacenamiento seguro.
- Integración de correo (resend, SES, etc.).
- Rate limiting y auditoría avanzada.
- Tests e2e mínimos para flujo de reseteo.
Ver LICENSE
en la raíz del proyecto.