Este documento deja listo el login con Supabase y la tabla public.usuarios, con funciones seguras y un usuario admin inicial para entrar al sistema.
js/supabase-config.js con URL y anon key).Archivo: sql/login_prereqs.sql
Qué hace:
uuid-ossp y pgcrypto.actualizar_timestamp() y configura el trigger si no existe.hash_password y verificar_password.auth_login_v2(p_email, p_password), SECURITY DEFINER y le da GRANT EXECUTE a anon, authenticated.usuarios.admin@gamecontrol.local / ChangeMe123! (no sobrescribe si ya existe).Pasos:
sql/login_prereqs.sql y ejecútalo en el SQL Editor de Supabase.auth_login_v2 aparece en la sección de Funciones (o espera 1 minuto a que PostgREST refresque el esquema).login.html (idealmente servido desde un servidor estático o GitHub Pages).admin@gamecontrol.localChangeMe123!index.html (dashboard).Notas:
signInWithPassword indica “confirmación de correo”, revisa tu bandeja. También puedes iniciar sesión una vez y el sistema intentará crear el usuario en Auth automáticamente con signUp si hiciera falta.Usa el siguiente ejemplo (SQL Editor) para crear un usuario operador real con password ya hasheado en el servidor:
insert into public.usuarios (nombre, email, password_hash, rol, estado, permisos)
values (
'Operador Tienda',
'operador@tu-dominio.com',
public.hash_password('TuPasswordFuerte2025!'),
'operador',
'activo',
'{"dashboard": true, "salas": true, "ventas": true}'::jsonb
);
Luego, ese operador podrá iniciar sesión directamente en login.html. La primera vez, el sistema
intentará crear la sesión en Supabase Auth con signInWithPassword y, si no existe, hará signUp (maneja “already registered”).
update public.usuarios
set password_hash = public.hash_password('NuevoPasswordMuySeguro!')
where lower(email) = lower('admin@gamecontrol.local');
auth_login_v2 como SECURITY DEFINER y con search_path = public. Evita usar funciones con calificación ambigua.usuarios al role anon. El RPC ya evita problemas de RLS.login.html mostrará error y no generará bucles.sql/login_prereqs.sql y espera 1 min. o pulsa Reintentar.Con esto, el login queda listo para producción con datos reales iniciales y un flujo seguro vía RPC + Supabase Auth.