Skip to content

Autenticação

Cada requisição autenticada ao GCM carrega um JSON Web Token (JWT) assinado pelo Supabase Auth. O token tem três funções:

  1. Identificar o usuário (claim sub).
  2. Identificar a qual organização ele pertence (claim organization_id, definido pelo nosso auth hook).
  3. Carregar os claims de papel/permissão usados pelas políticas de segurança em nível de linha do banco de dados.

Obtendo um token

Como usuário final (no navegador)

O aplicativo faz isso por você. Quando você faz login em /auth, o SDK armazena o token em localStorage e o atualiza automaticamente.

Programaticamente (para scripts, CI, integrações)

Use o password grant do Supabase:

bash
curl -X POST 'https://fzdacujgoluefgfbmren.supabase.co/auth/v1/token?grant_type=password' \
  -H 'apikey: YOUR_ANON_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"email":"you@church.org","password":"…"}'

Resposta:

json
{
  "access_token": "eyJhbGc…",
  "expires_in": 3600,
  "refresh_token": "vN9XzL…",
  "token_type": "bearer"
}

Dentro do token

Decodifique o access_token (base64url do segmento do meio) e você verá:

json
{
  "sub": "9a3b…",
  "email": "you@church.org",
  "role": "authenticated",
  "organization_id": "de00…",
  "is_platform_admin": false,
  "is_superadmin": false,
  "exp": 1782385294
}

Não confie nesses claims no lado do cliente

Qualquer pessoa pode forjar um JWT com claims arbitrários. O banco de dados confia apenas no que o Supabase assina. Se seu código cliente toma decisões de autorização, trate-as como dicas de UX — a verificação real acontece no servidor.

Atualização

O access token vive uma hora. Quando expira, troque-o por um novo:

bash
curl -X POST 'https://fzdacujgoluefgfbmren.supabase.co/auth/v1/token?grant_type=refresh_token' \
  -H 'apikey: YOUR_ANON_KEY' \
  -d '{"refresh_token":"…"}'

Tokens service-role

A chave service_role ignora completamente a segurança em nível de linha. Ela existe para migrações, jobs cron e integrações de backend que precisam atuar entre organizações. Nunca a envie para um navegador nem a comite no controle de versão. Nós a usamos apenas no lado do servidor — em edge functions via Deno.env.get('SUPABASE_SERVICE_ROLE_KEY'), nunca via HTTP.

Acesso multi-organização

Um único usuário auth (sub) pode pertencer a várias organizações tendo várias linhas em profiles — uma por organização. A organização ativa é selecionada no login (ou lembrada via cookie). O auth hook injeta qualquer organization_id que estiver ativo no JWT, para que o banco de dados limite corretamente.

Trocar de organização na interface dispara uma atualização do token.