fix(ops): setup_first_admin.sql usa email_confirmed_at (GoTrue v2.189.0)

Esquema real verificado en producción (information_schema.columns):
auth.users tiene tanto confirmed_at como email_confirmed_at — ambas son
columnas reales, así que el INSERT con confirmed_at nunca falló por
columna inexistente (por eso el usuario test-e2e se creó sin error).

Pero el login seguía rechazando con "Email o contraseña incorrectos"
incluso después de confirmar que el usuario existía — GoTrue valida
email_confirmed_at para permitir login por password, no confirmed_at.
Dejar confirmed_at solo creaba un usuario que nunca queda "confirmado"
para efectos de auth.

Agregado comentario documentando la versión de GoTrue verificada y cómo
re-verificar el schema si esto vuelve a cambiar.
This commit is contained in:
markosbenitez
2026-06-28 02:04:36 -03:00
parent 0fdee073a6
commit 5472043a33

View File

@@ -1,6 +1,13 @@
-- ============================================================
-- Script: crear primer usuario platform_admin
--
-- Verificado contra GoTrue v2.189.0 (supabase/gotrue:v2.189.0)
-- Schema de auth.users puede variar entre versiones de GoTrue.
-- Si falla con "column does not exist", verificar el schema real:
-- SELECT column_name FROM information_schema.columns
-- WHERE table_schema='auth' AND table_name='users'
-- ORDER BY ordinal_position;
--
-- USO:
-- docker exec -i supabase-db psql -U postgres -d postgres \
-- -v email='admin@ejemplo.com' -v password='CAMBIAR' \
@@ -16,43 +23,23 @@
WITH new_user AS (
INSERT INTO auth.users (
id,
instance_id,
aud,
role,
email,
encrypted_password,
confirmed_at,
created_at,
updated_at,
raw_app_meta_data,
raw_user_meta_data,
confirmation_token,
recovery_token,
email_change_token_new,
email_change,
id, instance_id, aud, role, email, encrypted_password,
email_confirmed_at, created_at, updated_at,
raw_app_meta_data, raw_user_meta_data,
confirmation_token, recovery_token,
email_change_token_new, email_change,
is_super_admin
) VALUES (
gen_random_uuid(),
'00000000-0000-0000-0000-000000000000',
'authenticated',
'authenticated',
'authenticated', 'authenticated',
:'email',
extensions.crypt(:'password', extensions.gen_salt('bf')),
now(),
now(),
now(),
now(), now(), now(),
'{"provider":"email","providers":["email"]}',
'{}',
'',
'',
'',
'',
false
)
RETURNING id, email
'{}', '', '', '', '', false
) RETURNING id
)
INSERT INTO public.user_roles (user_id, app_role, org_id)
SELECT id, 'platform_admin', '10000000-0000-0000-0000-000000000002'
FROM new_user
RETURNING (SELECT email FROM new_user), user_id;
FROM new_user;