06 - Criando os Usuários
Existem três formas práticas de criar usuários no Supabase Auth:
✅ 1) Criar usuários pelo painel (modo manual)
Ideal quando você quer apenas testar ou criar poucos usuários.
- Vá para Authentication → Users
- Clique em ➕ Add user
- Preencha:
- Password (opcional dependendo da config)
- Marque "Confirm email" (se quiser evitar confirmação por link)
- Salvar
O usuário já nasce ativo e pode logar.
✅ 2) Criar usuários via código no Next.js (admin panel)
Aqui você usa a SUPABASE_SERVICE_ROLE_KEY, porque criar usuários exige permissão administrativa.
Crie um arquivo:
app/admin/create-user/route.ts
import { NextResponse } from 'next/server';
import { createClient } from '@supabase/supabase-js';
const supabaseAdmin = createClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.SUPABASE_SERVICE_ROLE_KEY!, // <- chave secreta (somente server)
);
export async function POST(request: Request) {
const { email, password } = await request.json();
const { data, error } = await supabaseAdmin.auth.admin.createUser({
email,
password,
email_confirm: true // cria sem precisar o usuário confirmar
});
if (error) {
return NextResponse.json({ error: error.message }, { status: 400 });
}
return NextResponse.json({ user: data.user }, { status: 201 });
}
Agora você pode chamar essa rota via fetch ou via formulário.
Exemplo de POST via console do browser:
await fetch("/admin/create-user", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ email: "user@test.com", password: "admin123" })
});
✅ 3) Criar usuários automaticamente pelo script Obsidian Sync
Você pode adicionar ao script um trecho que:
- lê uma lista de usuários num YAML/CSV
- cria todos automaticamente antes de sincronizar docs
Exemplo simples:
const users = [
{ email: "financeiro@empresa.com", password: "123456", group: "financeiro" },
{ email: "suporte@empresa.com", password: "123456", group: "suporte" },
];
for (const user of users) {
const { data, error } = await supabaseAdmin.auth.admin.createUser({
email: user.email,
password: user.password,
email_confirm: true
});
if (!error) {
console.log(`Usuário criado: ${user.email}`);
} else {
console.log(`Erro: ${error.message}`);
}
}
📌 Atribuindo o usuário a um grupo
Depois que o usuário existe em auth.users, você coloca ele no grupo:
await supabaseAdmin.from("app_group_users").insert({
user_id: data.user.id,
group_id: "<UUID_DO_GRUPO>"
});
💡 Exemplo de rota completa: criar usuário + vincular grupo
app/admin/user-create/route.ts:
import { NextResponse } from 'next/server';
import { createClient } from "@supabase/supabase-js";
const supabaseAdmin = createClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.SUPABASE_SERVICE_ROLE_KEY!,
);
export async function POST(request: Request) {
const { email, password, groupSlug } = await request.json();
// Criar usuário
const { data: userData, error } = await supabaseAdmin.auth.admin.createUser({
email,
password,
email_confirm: true,
});
if (error) return NextResponse.json({ error: error.message }, { status: 400 });
// Buscar grupo pelo slug
const { data: group } = await supabaseAdmin
.from("app_groups")
.select("id")
.eq("slug", groupSlug)
.single();
if (!group) return NextResponse.json({ error: "Grupo não encontrado." }, { status: 404 });
// Relacionar usuário ao grupo
await supabaseAdmin.from("app_group_users").insert({
group_id: group.id,
user_id: userData.user.id
});
return NextResponse.json({ created: true, user: userData.user });
}
Agora você pode chamar:
await fetch("/admin/user-create", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
email: "novo@empresa.com",
password: "senha123",
groupSlug: "financeiro"
})
});
🏁 Resumo rápido
| Método | Serve pra | Deve usar service role? |
|---|---|---|
| Painel do Supabase | criar manualmente | ❌ |
Rota /admin/create-user no Next.js |
criar via interface + painel interno | ✅ |
| Script automatizado | onboarding automático (ex: import Excel, Obsidian, etc.) | ✅ |