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

  1. 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.
  2. Org e mediador usam contas autenticadas nos respectivos hosts. Docs e blog são públicos. api. só serve /v1/* (JSON).
  3. Partes acessam /portal/{token} pelo e-mail de convite, sem cadastro. O token identifica o participante; guarde o link como credencial.
  4. Parceiros autenticam com Authorization: Bearer dk_… (hash no banco). Keys só no backend do parceiro — nunca no frontend.
  5. Embed: POST /v1/embed-sessions emite token curto; UI em empresas /embed/cases/:id com CSP frame-ancestors na allowlist da org.
  6. Convites (equipe, partes e mediador) expiram em 7 dias. Após expirar, a org/plataforma precisa reenviar ou regenerar.
  7. Cookie dc_active_org guarda a organização ativa no app B2B; logout limpa essa preferência.
  8. 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).