Autenticacion
GoConverso usa Supabase Auth para toda la autenticacion. Esto te brinda sesiones basadas en JWT, multiples proveedores OAuth y acceso seguro a nivel de fila a tus datos.
Metodos de autenticacion
GoConverso soporta los siguientes metodos de autenticacion:
| Metodo | Descripcion | Mejor para |
|---|---|---|
| Email y contrasena | Registro e inicio de sesion tradicional | La mayoria de los usuarios |
| Google OAuth | Inicio de sesion con un clic usando Google | Incorporacion rapida |
| OTP (Contrasena de un solo uso) | Enlace magico o codigo de 6 digitos por email | Acceso al portal del cliente |
| Clave API + JWT | Acceso programatico | Integraciones servidor a servidor |
Claves API
Cada proyecto de GoConverso tiene dos claves API:
Clave anonima (publica)
La clave anonima es segura para usar en codigo del lado del cliente. Respeta las politicas de Seguridad a Nivel de Fila (RLS), lo que significa que los usuarios solo pueden acceder a los datos que estan autorizados a ver.
apikey: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...Clave de rol de servicio (secreta)
La clave de rol de servicio omite todas las politicas RLS y otorga acceso completo a la base de datos. Usala solo en codigo del lado del servidor, edge functions o entornos backend seguros.
Nunca expongas la clave de rol de servicio en codigo del lado del cliente. Esta clave tiene acceso irrestricto a toda tu base de datos, incluyendo todos los datos de usuario. Almacenala en variables de entorno y usala solo en contextos del lado del servidor.
Tokens JWT
Cuando un usuario inicia sesion, Supabase emite un JSON Web Token (JWT) que contiene el ID del usuario, email y metadatos. Este token se usa para autenticar las solicitudes posteriores a la API.
Estructura del token
Un JWT decodificado de GoConverso contiene:
{
"sub": "550e8400-e29b-41d4-a716-446655440000",
"email": "user@example.com",
"role": "authenticated",
"aud": "authenticated",
"exp": 1706540400,
"iat": 1706536800,
"user_metadata": {
"full_name": "Maria Silva",
"username": "mariasilva",
"niche": "barber"
}
}Ciclo de vida del token
| Evento | Comportamiento |
|---|---|
| Inicio de sesion | Se emiten token de acceso + token de actualizacion |
| El token de acceso expira | Se actualiza automaticamente usando el token de actualizacion (predeterminado: 1 hora) |
| El token de actualizacion expira | El usuario debe iniciar sesion nuevamente (predeterminado: 7 dias) |
| Cierre de sesion | Ambos tokens se invalidan |
Autenticacion de solicitudes
Cada solicitud a la API debe incluir dos encabezados:
curl -X GET "https://<project-id>.supabase.co/rest/v1/bookings" \
-H "apikey: <your-anon-key>" \
-H "Authorization: Bearer <jwt-access-token>" \
-H "Content-Type: application/json"apikey— identifica tu proyecto (usa la clave anonima)Authorization— identifica al usuario autenticado (usa el token de acceso JWT)
Registro con email y contrasena
Crear la cuenta de usuario
const { data, error } = await supabase.auth.signUp({
email: 'newuser@example.com',
password: 'secure-password-123',
options: {
data: {
full_name: 'New User',
username: 'newuser',
niche: 'personal_trainer'
}
}
})Manejar la respuesta
En caso de exito, la respuesta incluye el nuevo objeto de usuario y una sesion:
{
"user": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"email": "newuser@example.com",
"user_metadata": {
"full_name": "New User",
"username": "newuser",
"niche": "personal_trainer"
}
},
"session": {
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"refresh_token": "v1.MjA5Nj...",
"expires_in": 3600
}
}Creacion automatica de perfil
GoConverso crea automaticamente una fila en profiles cuando un nuevo usuario se registra. Esto se maneja mediante un trigger de base de datos, por lo que no se necesita una llamada API adicional.
Iniciar sesion con email y contrasena
const { data, error } = await supabase.auth.signInWithPassword({
email: 'user@example.com',
password: 'secure-password-123'
})
if (error) {
console.error('Sign in failed:', error.message)
return
}
// Token de acceso para solicitudes a la API
const accessToken = data.session.access_tokenOAuth con Google
GoConverso soporta Google OAuth para inicio de sesion con un clic. Este es el metodo recomendado para la experiencia de incorporacion de usuario mas rapida.
Iniciar el flujo OAuth
const { data, error } = await supabase.auth.signInWithOAuth({
provider: 'google',
options: {
redirectTo: 'https://converso.pro/auth/callback',
queryParams: {
access_type: 'offline',
prompt: 'consent'
}
}
})Manejar el callback
Despues de que el usuario autoriza tu aplicacion, es redirigido a tu URL de callback con un codigo de autorizacion. El cliente de Supabase lo intercambia automaticamente por una sesion.
// En tu pagina de callback (ej., /auth/callback)
const { data: { session }, error } = await supabase.auth.getSession()
if (session) {
// El usuario esta autenticado
console.log('Signed in as:', session.user.email)
}Acceder a Google Calendar (opcional)
Si necesitas integracion con Google Calendar, solicita alcances adicionales durante el flujo OAuth:
const { data, error } = await supabase.auth.signInWithOAuth({
provider: 'google',
options: {
redirectTo: 'https://converso.pro/auth/callback',
scopes: 'https://www.googleapis.com/auth/calendar.events'
}
})Autenticacion OTP (Portal del Cliente)
GoConverso usa autenticacion basada en OTP para el portal del cliente. Los clientes reciben un codigo de 6 digitos por email para acceder a su portal sin necesidad de contrasena.
// Solicitar OTP
const response = await fetch(
'https://<project-id>.supabase.co/functions/v1/send-portal-otp',
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
email: 'client@example.com',
professionalId: '<professional-uuid>'
})
}
)
// Verificar OTP
const verify = await fetch(
'https://<project-id>.supabase.co/functions/v1/verify-portal-otp',
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
email: 'client@example.com',
code: '123456',
professionalId: '<professional-uuid>'
})
}
)Los codigos OTP expiran despues de 10 minutos y solo se pueden usar una vez. Si un cliente solicita un nuevo codigo, cualquier codigo emitido previamente se invalida automaticamente.
Gestion de sesiones
La libreria cliente de Supabase maneja la gestion de sesiones automaticamente, incluyendo la actualizacion de tokens. Puedes escuchar cambios en el estado de autenticacion:
supabase.auth.onAuthStateChange((event, session) => {
switch (event) {
case 'SIGNED_IN':
console.log('User signed in:', session.user.email)
break
case 'SIGNED_OUT':
console.log('User signed out')
break
case 'TOKEN_REFRESHED':
console.log('Token refreshed')
break
}
})Cerrar sesion
const { error } = await supabase.auth.signOut()Mejores practicas de seguridad
- Almacena tokens de forma segura — Usa cookies
httpOnlyo almacenamiento seguro. Nunca almacenes JWTs enlocalStoragepara aplicaciones sensibles. - Usa la clave anonima en el cliente — La clave anonima esta limitada por politicas RLS. Nunca uses la clave de rol de servicio en codigo del navegador.
- Valida tokens del lado del servidor — Si construyes endpoints personalizados, verifica la firma JWT usando el secreto JWT de tu proyecto.
- Habilita RLS en todas las tablas — GoConverso tiene RLS habilitado por defecto. Nunca lo desactives sin entender las implicaciones.
- Rota las claves periodicamente — Si sospechas que una clave ha sido comprometida, rotala inmediatamente en el panel de Supabase.
A continuacion, aprende como trabajar con Webhooks para recibir notificaciones de eventos en tiempo real.