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:
- Identificar o usuário (claim
sub). - Identificar a qual organização ele pertence (claim
organization_id, definido pelo nosso auth hook). - 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:
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:
{
"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á:
{
"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:
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.
