Como tratamos seus tokens
Explicacao sobre criptografia de tokens OAuth da Meta, isolamento por usuario e validacao HMAC de webhooks.
O UltronChat nunca armazena seus tokens OAuth em texto puro. Toda credencial sensivel (Instagram, Messenger, WhatsApp) passa por uma camada de criptografia simetrica e fica isolada por usuario via Row-Level Security do Postgres.
Criptografia de tokens OAuth
Quando voce conecta uma conta:
- O dashboard faz o fluxo OAuth padrao da Meta e recebe um
access_tokende longa duracao. - Imediatamente, o token e criptografado com AES-256-GCM usando HKDF para derivar a chave a partir de uma master key armazenada em variavel de ambiente (
TOKEN_ENCRYPTION_KEY). - O texto cifrado e gravado na coluna
encrypted_access_tokenda tabelaconnections. O token original nunca toca disco nao-cifrado.
Quando uma Edge Function precisa enviar uma mensagem, ela:
- Le
encrypted_access_tokendo banco. - Decripta em memoria.
- Faz a chamada a Graph API da Meta.
- Descarta o token apos a requisicao — nunca persiste a forma decifrada.
O que isso significa na pratica
- Um dump do banco nao expoe tokens. O atacante precisaria tambem da master key.
- A master key fica em secrets gerenciados (Vercel para dashboard, Supabase Edge Function Secrets para backend), jamais no repositorio.
- Mesmo administradores do UltronChat nao conseguem "ler" seu token — apenas o processo automatizado decripta em tempo de execucao.
Row-Level Security (RLS)
Todas as tabelas com dados de usuario tem policies RLS que filtram automaticamente por auth.uid():
connections— soSELECTondeuser_id = auth.uid().agents,automations,conversations,messages,leads— JOIN comconnectionspara garantir ownership.subscriptions,user_api_keys— filtradas poruser_id.
Isso significa que mesmo se um bug expuser o endpoint do banco (ex.: anon key vazada), um usuario nao consegue ler dados de outro. A isolacao e enforced no nivel do Postgres.
Validacao HMAC de webhooks
Webhooks da Meta sao recebidos pelo Cloudflare Worker (webhook-gateway). Antes de enfileirar qualquer evento no sistema interno, o Worker valida o cabecalho X-Hub-Signature-256:
- Calcula HMAC SHA256 do body com o App Secret correspondente.
- Compara (timing-safe) com a assinatura recebida.
- Se nao bater, retorna 401 e o evento nao entra na fila.
O UltronChat usa tres App Secrets diferentes — um para Instagram, um para Messenger (app principal), e um para WhatsApp (app dedicado B). Isso garante que mesmo se um secret for comprometido, as outras plataformas continuam seguras.
TLS em toda comunicacao
- Dashboard (Vercel) — HTTPS com HSTS habilitado e
max-age=63072000(2 anos). - Supabase API e Edge Functions — HTTPS nativo.
- Cloudflare Worker — HTTPS nativo.
- Upstash QStash / Redis — HTTPS nativo.
Nenhuma parte do sistema aceita HTTP puro.
Headers de seguranca
O dashboard envia em toda resposta:
X-Frame-Options: DENY— previne clickjacking.X-Content-Type-Options: nosniff— previne MIME sniffing.Referrer-Policy: strict-origin-when-cross-origin.Strict-Transport-Security(HSTS) — forca HTTPS.Content-Security-Policyrestritiva — so permite scripts do proprio dominio.
Auditoria
Operacoes sensiveis sao logadas:
- Eventos de assinatura (
subscription_events). - Execucoes de automacao (
automation_logs). - Validacoes de BYOK (
user_api_keys.last_validated_at,last_error).
Logs brutos de Edge Functions e Worker sao rotacionados e acessaveis apenas pelo time operacional.
Proximos passos
- BYOK e chaves de API — como protegemos suas chaves do OpenAI / Anthropic.
- LGPD e privacidade — resumo do que coletamos e seus direitos.