O header X-Tenant-Id que diverge do JWT devolve 403

[!NOTE] Resumo Executivo (DEV-2026-051): No CRM do ImobHub o tenant da sessão é o companyId do JWT. Um X-Tenant-Id diferente não troca a imobiliária: a API responde 403.


🚨 O Desafio Técnico / Contexto

Listar e gravar imóvel e lead filtrava por company_id, mas um header podia apontar outro tenant. Sem a checagem, a sessão e o header divergiam em silêncio.


💡 Principais Lições Aprendidas & Descobertas

  • 💡 auth.middleware.ts grava req.user.companyId e req.tenantId a partir do JWT verificado.
  • 💡 tenant.middleware.ts, se já há sessão e o header X-Tenant-Id difere, responde 403 com tenant_id não confere com a sessão.
  • 💡 Sem sessão, o header ainda preenche req.tenantId. Com sessão, o companyId do token é o que vale.

🛠️ Especificação Técnica & Código-Chave

if (sessionTenant && headerTenant && headerTenant !== sessionTenant) {
  return res.status(403).json({ error: 'tenant_id não confere com a sessão' });
}
req.tenantId = sessionTenant;

📈 Impacto no Ecossistema & Valor Prático

Consulta e escrita do CRM ficaram presas à imobiliária do token, não ao header.

  • Projetos Relacionados: sio-ecosystem
  • Registro de Origem: _data/daily.dev-04.yml

Publicado originalmente como parte do Diário de Desenvolvimento 2026 do ecossistema Artes do Sul & Araguaci.