Segurança e acesso
Cookies host-only entre B2B, mediador, docs, blog e api; portal por token; API keys de parceiro; embed com frame-ancestors; partes sem conta.
Objetivo
Explicar como autenticação e tokens isolam hosts e papéis.
Deixar claro que partes externas não criam conta: o portal é o canal.
Documentar API keys e embed de parceiros (sem expor service role).
Quando usar
Ao debugar sessão “perdida” entre desconflite.com e mediadores.desconflite.com.
Quando um convite ou link de portal falha ou expirou.
Ao integrar um app parceiro (API / embed).
Pré-requisitos
Hosts configurados (APP_URL, EMPRESAS, API, MEDIATOR, DOCS, BLOG).
Passo a passo na interface
- Cookies de sessão Supabase Auth são host-only — não use Domain=.desconflite.com. Login no B2B não autentica automaticamente no host do mediador e vice-versa.
- Org e mediador usam contas autenticadas nos respectivos hosts. Docs e blog são públicos. api. só serve /v1/* (JSON).
- Partes acessam /portal/{token} pelo e-mail de convite, sem cadastro. O token identifica o participante; guarde o link como credencial.
- Parceiros autenticam com Authorization: Bearer dk_… (hash no banco). Keys só no backend do parceiro — nunca no frontend.
- Embed: POST /v1/embed-sessions emite token curto; UI em empresas /embed/cases/:id com CSP frame-ancestors na allowlist da org.
- Convites (equipe, partes e mediador) expiram em 7 dias. Após expirar, a org/plataforma precisa reenviar ou regenerar.
- Cookie dc_active_org guarda a organização ativa no app B2B; logout limpa essa preferência.
- Redirect URLs do Supabase Auth devem incluir os hosts B2B e mediador (produção e *.local em dev).
Resultado esperado
Sessões isoladas por host; partes operando só com token válido; parceiros com key/scopes; embed só em origins allowlisted.
Erros comuns e como resolver
Estou logado no site mas o mediador pede login de novo.
Comportamento esperado com cookies host-only. Faça login em mediadores.desconflite.com.
Link do portal não abre / diz que expirou.
Peça reenvio do convite (7 dias). Não compartilhe o token; quem tiver o link age como aquela parte.
Parte pediu conta no Desconflite.
Partes não precisam de conta — só o link do portal. Contas são para org, mediador e plataforma.
Iframe do embed em branco / recusado.
Cadastre a origin do parceiro em Configurações → Integrações e use um embed-session token válido (TTL).