Breve template para un flujo de autenticación usando React (Vite + TypeScript), Supabase y Zustand.
Proveer un proyecto base que implementa el flujo de autenticación (login, registro, recuperación/actualización de contraseña, rutas protegidas) y un pequeño store centralizado con Zustand.
- Requisitos previos
- Configuración de variables de entorno
- Cómo levantar el proyecto (desarrollo)
- Flujo de la aplicación (qué hace cada pieza)
- Archivos clave y su propósito
- Notas y pasos siguientes
- Node.js (16+ recomendado) y npm o pnpm/yarn
- Cuenta y proyecto en Supabase
Nota: este repo usa Vite; las variables de entorno deben seguir la convención de Vite (prefijo VITE_)
Crear un archivo .env en la raíz del proyecto duplicando el archivo .env.example e ingresando las variables:
VITE_SUPABASE_URL=https://<tu-proyecto>.supabase.co
VITE_SUPABASE_ANON_KEY=<tu-anon-key>
Asunción: el cliente Supabase en src/lib/client.ts lee import.meta.env.VITE_SUPABASE_URL y import.meta.env.VITE_SUPABASE_ANON_KEY.
- Instalar dependencias
npm install
# o: pnpm install
# o: yarn- Levantar servidor de desarrollo
npm run dev
# o: pnpm dev
# o: yarn devAbre http://localhost:5173 (u otra URL que indique Vite) y prueba el flujo.
Resumen general:
-
Al iniciar la app,
AuthProvider(ensrc/context/AuthContext.tsx) inicializa el estado de autenticación:- Llama a
supabase.auth.getSession()para recuperar la sesión si existe. - Se suscribe a
supabase.auth.onAuthStateChangepara sincronizar los cambios de sesión en tiempo real. - Actualiza el store de Zustand (
src/store/useAuthStore.tsx) consession,isLoggedIn,isLoading,error.
- Llama a
-
Al iniciar sesión (
LoginForm):- El formulario llama
logIndel contexto, que usasupabase.auth.signInWithPassword. - Si el login es exitoso, la sesión se actualizará vía el listener
onAuthStateChangeyAuthContextnavega a/dashboard.
- El formulario llama
-
Cerrar sesión:
AuthContext.logOutllama asupabase.auth.signOut(), limpia el store y redirige a/login.
-
Rutas protegidas:
ProtectedRoute(ensrc/components/auth/ProtectedRoute.tsx) muestraLoadingScreenmientrasisLoadinges true.- Si no hay sesión válida redirige a
/login. - Si la sesión existe, renderiza los children protegidos (vía
<Outlet />).
src/context/AuthContext.tsx— Proveedor de autenticación. Inicializa sesión, escucha cambios, exponelogIn,logOut,clearError, y estado.src/store/useAuthStore.tsx— Zustand store que mantienesession,isLoggedIn,isLoading,errory setters.src/lib/client.ts— Cliente Supabase (lee variables de entorno). (Comprueba este archivo para confirmar nombres de env si cambias la convención.)src/components/auth/login-form.tsx— Formulario de login que consumeAuthContext.src/components/auth/sign-up-form.tsx— Formulario de registro (si está implementado en el repo).src/components/auth/ProtectedRoute.tsx— Componente para proteger rutas.src/pages/dashboard/dashboard.tsx— Página protegida de ejemplo.src/App.tsx— Rutas principales y envoltura delAuthProvider.
- Inicio de app con sesión válida o sin sesión.
- Manejo de estados de carga (isLoading) para evitar parpadeos o renderizar rutas protegidas antes de validar sesión.
- Errores de autenticación expuestos en el UI vía
erroren el store.
- Si al iniciar no se conecta con Supabase, revisa las variables en
.envy que el proyecto de Supabase permita el dominio local. - Si las rutas protegidas redirigen incorrectamente, abre la consola del navegador para ver logs del
AuthContext(hay console.log en la inicialización y en los listeners).
- Añadir manejo de refresco de token si usas sesiones expirables y quieres UX ininterrumpida.
- Añadir tests unitarios para
AuthContextyProtectedRoute. - Añadir documentación de endpoints o políticas de roles si el proyecto requiere autorización por rol.
👨💻 Kevin Rodríguez
- 🎓 Estudiante de Ingeniería de Software
- 🌎 El Salvador 🇸🇻
- 🗣️ Bilingüe (Español e Inglés)
MIT
Este template está disponible para uso público. Si lo encuentras útil, considera darle una estrella en GitHub o contactarme para sugerencias o mejoras.