Cómo gestionar usuarios en Supabase

Search for a command to run...

No comments yet. Be the first to comment.
Smart Tickets, una de mis apps, lleva en producción desde 2023. Tres años. Hoy tiene 28 suscripciones activas, 7 trials abiertos y 71 dólares de MRR. La gente paga por ella. La idea está validada. La
Estoy seguro de que alguna vez te ha pasado: tienes una idea que te parece la idea perfecta, y lo primero que haces es ir a GitHub, crear un repositorio y ponerte a programar. Lo sé porque a mí me pasa continuamente. El problema es que, a medida que ...
En la era digital actual, las aplicaciones móviles se han convertido en una parte integral de nuestras vidas. Desde hacer compras online hasta mantenerse en contacto con amigos y familiares, las aplicaciones hacen todo más fácil y accesible. Sin emba...

En el post anterior sobre JavaScript te expliqué conceptos básicos como las variables, los tipos de datos, los condicionales, los operadores, las funciones… Ahora que ya sabes estos conceptos de JavaScript es importante que entiendas cómo se ejecuta ...

Supabase nos facilita la autenticación de usuarios mediante su tabla auth.users. Sin embargo, para almacenar información adicional del usuario (como nombre, avatar, etc.), es recomendable crear una tabla personalizada, por ejemplo, public.profiles, y vincularla con auth.users. Esto nos permite mantener una estructura clara y acceder fácilmente a los datos desde el cliente.
public.profilesPrimero, definimos la tabla profiles en el esquema public, estableciendo una relación con auth.users mediante una clave foránea:
id esté conectado con el auth.users.create table public.profiles (
id uuid not null references auth.users on delete cascade,
username text,
full_name text,
avatar_url text,
primary key (id)
);
alter table public.profiles enable row level security;
Aquí, id es la clave primaria y referencia al id de auth.users. El uso de on delete cascade asegura que, si un usuario se elimina de auth.users, su perfil asociado también se elimine automáticamente.
Para proteger los datos y controlar el acceso, activamos las políticas de seguridad a nivel de fila (Row Level Security) y definimos las siguientes políticas:
-- Permitir que cualquier usuario autenticado inserte su propio perfil
create policy "Users can insert their own profile."
on profiles for insert
with check (auth.uid() = id);
-- Permitir que los usuarios actualicen su propio perfil
create policy "Users can update own profile."
on profiles for update
using (auth.uid() = id);
-- Permitir que los usuarios vean su propio perfil
create policy "Users can view their own profile."
on profiles for select
using (auth.uid() = id);
Estas políticas garantizan que cada usuario solo pueda acceder y modificar su propio perfil. El contenido que está entre comillas (““) es una descripción de la política, puedes poner lo que quieras ahí para poder identificarla mejor en el futuro.
triggersPara que cada vez que un usuario se registre se cree automáticamente su perfil en public.profiles, utilizamos una función y un trigger:
-- Función que inserta un nuevo perfil al registrarse un usuario
create or replace function public.handle_new_user()
returns trigger
language plpgsql
security definer
set search_path = public
as $$
begin
insert into public.profiles (id, username, full_name, avatar_url) -- Aquí puedes agregar o quitar todos los campos que tengas en tu tabla
values (
new.id,
new.raw_user_meta_data ->> 'username',
new.raw_user_meta_data ->> 'full_name',
new.raw_user_meta_data ->> 'avatar_url'
); -- El orden de estos campos es importante, porque el valor se insertará en la tabla correspondiente al orden definido en el insert de arriba
return new;
end;
$$;
-- Trigger que ejecuta la función después de insertar un nuevo usuario
create trigger on_auth_user_created
after insert on auth.users
for each row execute procedure public.handle_new_user();
Con esto, cada vez que un nuevo usuario se registre, se creará automáticamente una entrada en public.profiles con los datos proporcionados.
triggers y funciones creados en el editor visual de Supabase si accedes desde el menú lateral a database > functions o database > triggers.metadata adicionalAl registrar un usuario, podemos incluir información adicional en el campo data, que luego se almacenará en raw_user_meta_data de auth.users y se utilizará en la función del trigger:
const { data, error } = await supabase.auth.signUp({
email: 'usuario@example.com',
password: 'contraseña_segura',
options: {
data: {
username: 'usuario123',
full_name: 'Nombre Apellido',
avatar_url: 'https://example.com/avatar.png'
}
}
});
De esta manera, los datos adicionales se insertarán automáticamente en la tabla profiles al momento del registro. Para que los datos se almacenen en la tabla profiles deberás asegurarte de que la función handle_new_user que hemos creado antes lea los datos de raw_user_meta_data y los inserte en una columna de la tabla profiles, de lo contrario estarás pasando los metadatos pero no se guardarán en tu tabla.
Si tienes alguna duda o quieres profundizar en algún aspecto, no dudes en dejar un comentario o contactarme.