PTENES
MÓDULO 4.2

🔐 Producción real: autenticación, seguridad, pagos e integración

Inicio de sesión, protección de datos, ingresos y conexión de un frontend a un workflow de n8n. Proteges la app con autenticación mediante Supabase, aíslas los datos con Row-Level Security, ejecutas la migración SQL y configuras las URL de autenticación, haces una auditoría de seguridad, agregas pagos freemium con Stripe, conectas la interfaz de un workflow de n8n mediante un webhook y cierras con el repaso de la iteración incremental.

9
Temas
~80
Minutos
Avanzado
Nivel
Producto
Tipo
Progreso del módulo 0% · 0 de 9

Llevar una app a producción consiste en apilar capas sobre lo que ya funciona. El diagrama de abajo muestra el orden: empezar por la app en línea, protegerla con autenticación y RLS, monetizarla con pagos y, por último, conectar workflows externos mediante un webhook.

App en línea primera app (4.1) Auth + RLS Supabase · aísla datos + auditoría Pago Stripe · freemium gratis + pro n8n webhook Base de datos (Supabase) leads · suscripciones · RLS

Diagrama ilustrativo — recreación conceptual de las capas de producción, no es una captura de pantalla real.

1

🛡️ Por qué autenticar

Una app sin inicio de sesión es una app abierto: cualquier persona con la URL puede activar el workflow y consumir tus tokens de IA, y tú pagas por el uso de los demás. Autenticarse resuelve dos problemas a la vez: protege el uso (solo los usuarios registrados activan el backend) y protege los datos (cada quien solo ve lo suyo).

💡 El riesgo de la app abierta

Mientras la app esté sin autenticación en producción, cualquiera puede consumir tus tokens. Agregar el inicio de sesión es el primer paso de la «producción real»: antes de pensar en ingresos, cierras la puerta.

  • •Uso: solo los usuarios autenticados activan el workflow.
  • •Datos: cada usuario tiene los suyos, aislados de los demás.
  • •Costo: dejas de pagar por el consumo de desconocidos.

✗ App abierta en producción

  • ✗Cualquier URL compartida se convierte en consumo de tus tokens.
  • ✗Sin usuarios, no hay forma de aislar los datos.
  • ✗Sin iniciar sesión, no hay forma de cobrar después.

✓ App autenticada

  • ✓El inicio de sesión/registro filtra quién activa el backend.
  • ✓Cada usuario tiene datos propios y protegidos.
  • ✓Base lista para niveles gratis y pagos.

🎯 Consejo práctico

No dejes una app sin autenticación en línea durante mucho tiempo. El inicio de sesión es la primera capa de producción; todo lo demás (seguridad más detallada, pagos) se apoya en ella.

2

🔑 Autenticación con Supabase

O Supabase entra como proveedor de base de datos y autenticación: en Plan Mode, le pides a la IA que agregue el inicio de sesión y el registro a la app usando Supabase. En la plataforma, creas el proyecto y defines el contraseña de la base de datos (distinta de la contraseña de inicio de sesión) y eliges la región.

Configuración de Supabase

1

Crear el proyecto

Define la contraseña de la base de datos (¡distinta de la contraseña de inicio de sesión!) y elige la región más cercana a tus usuarios.

2

Copiar URL + publishable key

Obtén la project URL y la publishable key de Supabase para usarlas como variables de entorno.

3

Agregar como env vars en Vercel

Agrega la URL y la key como variables de entorno en Vercel y vuelve a implementar para que el frontend conozca Supabase.

⚠️ Atención

  • ✗La contraseña de la base de datos no es la contraseña de inicio de sesión; guarda ambas por separado.
  • ✗Secretos solo en env vars; nunca en el código del frontend ni en el chat.
Proyecto

Base de datos + autenticación listas.

Contraseña de la base de datos

≠ contraseña de inicio de sesión.

Región

Cerca del usuario.

URL + key

Variables de entorno en Vercel.

3

🧱 Row-Level Security (RLS)

Row-Level Security son reglas que viven dentro de la base de datos, no en el código de la interfaz. Garantizan que cada usuario solo vea sus propias filas, incluso si hay un error en el frontend. Es una capa de defensa que no depende de que el código de la pantalla sea perfecto: un bloqueo en el nivel más profundo.

✗ Sin RLS

  • ✗Un bug en el frontend puede filtrar datos de otro usuario.
  • ✗La seguridad depende por completo del código de la pantalla.
  • ✗Un solo fallo expone toda la base de datos.

✓ Con RLS activo

  • ✓La base de datos rechaza devolver filas de otro usuario.
  • ✓Defensa en profundidad: una barrera adicional además del frontend.
  • ✓Aislamiento por fila, en el nivel más bajo.

🧭 Defensa en profundidad

Una buena seguridad no confía en una sola capa. RLS se suma a la autenticación: aunque se eluda el inicio de sesión o haya un error en la pantalla, la base de datos sigue rechazando lo que no pertenece al usuario. Activa RLS en la tabla y haz una prueba.

🎯 Consejo práctico

Trata el RLS como innegociable: actívalo desde el inicio y confirma en la auditoría de seguridad que esté habilitado en todas las tablas con datos de usuario.

En la base de datos

No en el frontend.

Por fila

Aísla datos.

Capa extra

Defensa en profundidad.

Activar

En la tabla, y probar.

4

🗄️ Migración SQL y URLs de autenticación

Dos configuraciones hacen que la autenticación funcione de principio a fin. La migración SQL: ejecutar en el SQL editor de Supabase el SQL generado por la IA para crear la tabla (p. ej., la tabla de leads). Y las URLs de autenticación: configurar la URL de la app (Vercel) y la redirect URL, para que el inicio de sesión vuelva correctamente a la app.

SQL editor (ejemplo ilustrativo)
-- migração gerada pela IA
create table leads (
  id uuid primary key default gen_random_uuid(),
  user_id uuid references auth.users not null,
  empresa text,
  score int,
  created_at timestamptz default now()
);

-- liga o Row-Level Security
alter table leads enable row level security;

🗄️ Migración SQL

  • •Abre el editor SQL de Supabase.
  • •Pegar y ejecutar el SQL generado por la IA.
  • •Confirma la tabla creada (por ejemplo, leads).

🔗 URLs de autenticación

  • •Define la URL de la app (la de Vercel).
  • •Define la redirect URL del inicio de sesión.
  • •En authentication → URL configuration.

🎯 Consejo práctico

Si el inicio de sesión «funciona» pero no vuelve a la app, casi siempre el sospechoso es la redirect URL. Confirma que la URL de Vercel y la de redirección sean exactas en la configuración de auth de Supabase.

SQL editor

Ejecuta la migración.

Tabla

Creada con SQL.

URL de la app

La de Vercel.

Redirect

Vuelve del inicio de sesión.

5

🔎 Auditoría de seguridad

Antes de continuar, haz una auditoría explícita: limpia la conversación y pídele a la IA que actúe como especialista en seguridad y revise la app. Una auditoría solicitada a propósito detecta vulnerabilidades que pasan desapercibidas en el día a día y te da una lista clara de lo que debes corregir.

La lista de verificación de la auditoría

1

Rutas protegidas

Confirma que las páginas/endpoints sensibles exijan un usuario autenticado.

2

Ninguna clave expuesta

Garantizar que ninguna clave de API aparezca en el frontend (que se ejecuta en el navegador del usuario).

3

Secretos solo en env vars

Verificar que todos los secretos provengan de variables de entorno, nunca del código versionado.

4

RLS activo

Verifica que Row-Level Security esté activado en todas las tablas con datos de usuarios.

✓ Auditoría aprobada

  • ✓Las rutas sensibles requieren iniciar sesión.
  • ✓Nada de claves en el frontend.
  • ✓RLS confirmado en todas las tablas.

✗ Señales de alerta

  • ✗Endpoint accesible sin autenticación.
  • ✗La secret key llega al navegador.
  • ✗Tabla con datos de usuario sin RLS.

🎯 Consejo práctico

Pide la auditoría con un alcance explícito («revisa las rutas protegidas, las claves expuestas, los secretos en env y RLS»). Cuanto más específica sea la solicitud, más útil será el informe; corrige todo lo que falle antes de avanzar.

6

💳 Stripe: modelo freemium

Con el Stripe, la aplicación se convierte en un SaaS: un modelo freemium con un tier gratis limitado y un tier pago por suscripción, vía Stripe Checkout. La motivación es la misma que para la autenticación —limitar el uso para que no pagues por el consumo ilimitado de IA de los usuarios—, pero ahora con ingresos del otro lado.

🆓 Tier gratis

Limitado; por ejemplo: 2 calificaciones de leads por día.

  • •Permite probar la app.
  • •El límite controla tu costo de tokens.

⭐ Tier pro

Suscripción — p. ej.: US$ 29/mes, cualificaciones ilimitadas.

  • •Cobro recurrente mediante Checkout.
  • •Ingresos que sostienen la app.

🧭 De workflow a producto

El pago completa la transición: lo que empezó como "solo un workflow" ahora es una app que puede generar ingresos. En Plan Mode, la IA crea los paquetes, las env vars, las tablas, el cliente/servidor de Stripe y la página de precios, y actualiza la navbar.

🎯 Consejo práctico

Piensa en el freemium como dos objetivos complementarios: el nivel gratis protege tus costos y el nivel de pago genera ingresos. Define el límite del nivel gratis teniendo en cuenta el consumo real de tokens.

Freemium

Gratis + de pago.

Límite

Controla el costo.

Suscripción

Recurrente.

Checkout

Flujo de pago.

7

🧾 Producto, claves y webhook de Stripe

La integración de Stripe reúne cuatro piezas que vienen de distintos momentos. Creas el producto recurrente y copia el price ID; toma las claves (publicable + secreta); crea el webhook apuntando a tu URL con los eventos correctos; y ejecuta la migración de la tabla de suscripciones en Supabase.

Las piezas de la integración

1

Producto recurrente + price ID

Crea un producto de suscripción mensual, define el precio y copia el price ID.

2

Claves: publishable + secret

En developers → API keys, copia la publishable key y la secret key.

3

Webhook + eventos + webhook secret

Crea un endpoint que apunte a la URL de Vercel + /api/stripe-webhook, escuchando checkout.session.completed y los eventos de suscripción; copia el webhook secret.

4

Migración de la tabla de suscripciones

Ejecuta el SQL generado para crear la tabla de subscriptions y agrega las cuatro claves como variables de entorno en Vercel; vuelve a hacer el deploy.

⚠️ Atención

  • ✗Usa la URL exacta del webhook que proporcionó la IA; no inventes una.
  • ✗Mantén un bloc de notas para pegar las claves/ID durante el proceso.
  • ✗Prueba el checkout con una tarjeta de prueba (fecha futura, cualquier CVC).
Price ID

Del producto.

Claves

Publishable + secret.

Webhook

Eventos + secret.

Subscriptions

Tabla en la base de datos.

8

🪝 Frontend para workflow de n8n

Para darle una interfaz atractiva a un workflow de n8n, el patrón es cambiar dos nodos: el primero (el formulario) por un Webhook trigger, y el último por un nodo "Respond to Webhook". El frontend (generado y mejorado con la skill de diseño) envía los datos a la URL del webhook y muestra la respuesta; está conectado mediante una env var en Vercel.

Convertir el workflow + conectar el frontend

1

Cambiar el primer nodo por un Webhook

Quita el nodo de formulario y agrega un Webhook trigger, conectándolo a la lógica existente.

2

Cambiar el último nodo por "Respond to Webhook"

Quita el nodo de salida final y agrega "Respond to Webhook" para devolver la respuesta al frontend.

3

Publicar y copiar la URL de producción

Publica el workflow en n8n y copia la URL de producción del webhook (no la de prueba).

4

Conectar mediante una variable de entorno en Vercel

Agrega la URL del webhook de n8n como env var en Vercel y vuelve a hacer el deploy; prueba completando el formulario en producción.

🎯 Consejo práctico

El patrón para conectar cualquier workflow de n8n a un sitio siempre es el mismo: reemplaza el primer y el último nodo por webhooks. Confirma que el workflow esté publicado antes de copiar la URL y usa siempre la de producción.

Webhook

Reemplaza el formulario.

Respond

Devuelve la respuesta.

Producción

URL publicada.

Variable de entorno

Conecta en Vercel.

9

🪜 Iteración incremental (recap)

Todo el recorrido es una lección de iteración incremental: la app empezó como un prompt de una frase y creció por capas — diseño → autenticación → pago → integración. La buena ingeniería es así: empezar en pequeño, publicar pronto y escalar según la necesidad, sin planificarlo todo de una vez.

Las capas, en orden

1

App + diseño

De la idea a la app en línea, con un diseño profesional que se aleja del aspecto típico de la IA (Módulo 4.1).

2

Autenticación + seguridad

Usuarios reales con sus datos protegidos: Supabase, RLS y auditoría.

3

Pago + integración

Ingresos por suscripción con Stripe y workflows externos conectados mediante webhook.

✓ Iteración incremental

  • ✓Empezar poco a poco y publicar la primera versión.
  • ✓Crece por capas, una feature a la vez.
  • ✓Recopilar feedback real entre las capas.

✗ Big bang

  • ✗Intentar planificar todo antes de publicar nada.
  • ✗Agregar diseño, auth y pagos de una sola vez.
  • ✗Aplazar el lanzamiento esperando la «versión perfecta».

🎯 Consejo práctico

Resultado de la ruta: puedes conectar un backend/lógica a un frontend atractivo que la gente realmente usa. No necesitas planificar todo de antemano: publica algo pequeño y crece por capas.

Autocuración (opcional): ¿por qué Row-Level Security es una capa adicional de seguridad?

📌 Resumen del módulo

✓
Por qué autenticar — una app abierta permite que cualquiera consuma tus tokens; el inicio de sesión protege el uso y los datos.
✓
Supabase + RLS — autenticación y base de datos listas; las reglas de la base de datos aíslan los datos entre usuarios.
✓
Migración SQL y URLs + auditoría — ejecutar el SQL, configurar la URL/redirección y revisar las rutas, las claves, env y RLS.
✓
Stripe freemium — tier gratuito limitado + tier de pago; producto, claves, webhook y tabla de suscripciones.
✓
Frontend n8n + iteración — Webhook/Respond to Webhook conectados mediante una env var; crecer por capas.

Fin de la ruta:

Pasaste del concepto a una app real publicada, con automatizaciones, deploy, autenticación y pagos. Es hora de construir la tuya.