Documentación
docs

Autenticación

Autenticación en Shipabase: métodos de login, flujo de sesión con middleware, y cómo proteger páginas con requireAuth() y requireAccess().

Métodos de autenticación

Shipabase soporta tres métodos, que activas o desactivas por variable de entorno sin tocar código:

NEXT_PUBLIC_ALLOW_EMAIL=true      # Magic links por email
NEXT_PUBLIC_ALLOW_PASSWORD=true   # Email y contraseña
NEXT_PUBLIC_ALLOW_OAUTH=true      # Proveedores OAuth (Google, GitHub, etc.)

Los formularios de /signin se adaptan automáticamente a los métodos habilitados. La recuperación de contraseña ya viene integrada.

Para habilitar un proveedor OAuth concreto, actívalo en Supabase: Authentication → Providers, y configura las credenciales del proveedor.

El flujo de sesión

  1. El usuario inicia sesión desde el componente Auth
  2. Supabase crea la sesión (cookies gestionadas por @supabase/ssr)
  3. El middleware valida la sesión en cada ruta protegida
  4. Los Server Components acceden al usuario vía createClient()

Proteger páginas

Shipabase incluye dos helpers en utils/auth-helpers/access.ts:

requireAuth() — solo requiere login

Para páginas que necesitan un usuario autenticado pero no una suscripción activa (ajustes de cuenta, facturación):

// app/settings/page.tsx
import { requireAuth } from '@/utils/auth-helpers/access';

export default async function Settings() {
  const { user, supabase } = await requireAuth();
  // El usuario está garantizado: si no hay sesión, redirige a /signin

  return <div>Ajustes de {user.email}</div>;
}

requireAccess() — requiere login y suscripción activa

Para features premium, el dashboard o cualquier contenido de pago:

// app/dashboard/page.tsx
import { requireAccess } from '@/utils/auth-helpers/access';

export default async function Dashboard() {
  const { user, supabase } = await requireAccess();
  // Garantizado: logueado Y con acceso activo
  // Sin sesión → redirige a /signin
  // Sin suscripción → redirige a /pricing

  return <div>Dashboard premium</div>;
}

Cómo funciona: requireAccess() consulta la tabla subscriptions buscando una suscripción con estado activo. Esa tabla se mantiene sincronizada con Stripe vía webhooks, así que el acceso se corta solo cuando una suscripción se cancela o falla el pago.

Nota: el boilerplate soporta suscripciones recurrentes. Para lifetime deals o pagos únicos, puedes usar cupones de Stripe (100% de descuento para siempre) o implementar un sistema de canje aparte.

Siguiente paso

Entiende los Pagos y suscripciones.