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.

  1. Vá para Authentication → Users
  2. Clique em ➕ Add user
  3. Preencha:
    • Email
    • Password (opcional dependendo da config)
    • Marque "Confirm email" (se quiser evitar confirmação por link)
  4. 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:

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.)