# Checklist: Seguridad de Autenticación

> Curso **Crear Páginas Web con Lógica de Negocio** · Módulo 02
> Pasa esta lista sobre tu app cada vez que toques login, registro o permisos.

---

## A. Contraseñas y credenciales

- [ ] Las contraseñas **nunca** se guardan en texto plano (Supabase Auth las hashea por ti)
- [ ] Longitud mínima de 8 caracteres validada **en el servidor**
- [ ] No existe ningún `console.log` que imprima contraseñas o tokens
- [ ] El login fallido responde siempre "credenciales inválidas" — nunca "ese correo no existe"
- [ ] La recuperación de contraseña responde igual exista o no el correo (anti-enumeración)

## B. Sesiones y tokens

- [ ] La sesión vive en **cookies** gestionadas por `@supabase/ssr` (no en localStorage)
- [ ] El middleware renueva la sesión en cada petición (`supabase.auth.getUser()`)
- [ ] Cerrar sesión funciona y redirige fuera de las rutas protegidas
- [ ] Ningún token o JWT aparece en URLs (las URLs quedan en logs e historial)

## C. Rutas protegidas

- [ ] El middleware redirige a `/login` toda ruta privada sin sesión
- [ ] Cada layout protegido verifica la sesión **en el servidor**, no solo en el middleware
- [ ] Probaste entrar a `/admin` con un usuario `cliente`: te expulsa
- [ ] Probaste entrar a `/admin` sin sesión y con la URL escrita a mano: te expulsa

## D. Roles y permisos

- [ ] El rol vive en la tabla `perfiles` de la base de datos — jamás en un campo del formulario, el localStorage o una cookie editable
- [ ] La columna `rol` tiene `check` con la lista cerrada de roles válidos
- [ ] El trigger crea el perfil automáticamente al registrarse (rol por defecto: el de menor privilegio)
- [ ] Promover a admin solo es posible desde el SQL Editor o por otro admin — no hay ruta pública que lo haga
- [ ] Ocultar botones en la interfaz **no** es tu único control: la verificación real está en el servidor

## E. Formularios de auth

- [ ] Registro valida email, contraseña y nombre **en la Server Action** aunque el navegador ya haya validado
- [ ] La verificación de email está activada en Supabase (Authentication → Providers → Email)
- [ ] Las URLs de redirección (`emailRedirectTo`, recuperación) están registradas en Supabase → URL Configuration

## F. Prueba de fuego (hazla con dos navegadores)

1. [ ] Navegador A: cuenta cliente. Navegador B: cuenta admin.
2. [ ] El cliente no ve ni puede abrir nada de `/admin`
3. [ ] El admin ve el panel; al cerrar sesión, deja de verlo
4. [ ] Cambia la contraseña del cliente por el flujo de recuperación: la sesión vieja queda inválida
5. [ ] Intenta registrarte con un email ya usado: el mensaje no revela que la cuenta existe

---

**Regla de oro del módulo:** la autenticación dice *quién eres*; la autorización dice *qué puedes hacer* — y ambas se verifican en el servidor, siempre.
