MVP5 — Integração avançada, borda e multi-IdP

Fase 7 do plano AUTH-01 · Código tarefa: AUTH-09
Depende de: MVP1 Modo A concluído (Fases 0–5) · MVP4 parcial aceitável
Status: planejado

Documento público da Fase 7. Especificação detalhada e tarefas P7-xx: plano interno 2026-06-30_autenticacao-unificada-ecosif.md (Parte C, §26).


Objetivo

Fechar lacunas explícitas pós-MVP1 para ambientes enterprise e multi-plataforma:

Lacuna Entrega MVP5
Modos B/C só na spec, sem código Resource Server JWKS no starter + gateway + Angular
M2M sem usuário/senha eCosif POST /api/auth/token (client_credentials) nativo
Segurança na borda (deploy) API keys e mTLS documentados e implementáveis no gateway
Um IdP por ambiente Azure e Google habilitados simultaneamente

Posicionamento no roadmap

MVP1–3 (Modo A)     → login externo + JWT ECOSIF + signin local
MVP4                → groups/claims, identity_provider_link, gateway MS (parcial)
Fase 7 / MVP5       → Modos B/C + client_credentials + borda + multi-IdP

Não substitui o Modo A — clientes simples continuam com ECOSIF_API_TOKEN_MODE=ECOSIF_JWT.


Pilares da Fase 7

P7-A — Modos B e C no código

Implementar o que a Parte B do plano AUTH-01 já especifica.

Modo ECOSIF_API_TOKEN_MODE Token nas APIs Componente novo
B AZURE_ENTERPRISE_GATEWAY Access Token Entra (api://...) EcosifOAuth2ResourceServerConfig (JWKS Microsoft)
C GOOGLE_GATEWAY Token Google Idem (JWKS Google)

Entregas:

Gate P7-A: piloto com cliente que exige APIM Entra; E2E login + API com access token validado em gateway e backend.


P7-B — client_credentials nativo (ecosif-auth)

Endpoint OAuth2 para integrações server-to-server sem signin (usuário/senha) e sem depender exclusivamente do Entra do cliente.

Contrato proposto

POST /api/auth/token
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials
&client_id=<api_client_id>
&client_secret=<secret>
&scope=ecosif.api moviments:write   # opcional; escopos por cliente

Resposta 200:

{
  "access_token": "<jwt_ecosif>",
  "token_type": "Bearer",
  "expires_in": 1800,
  "scope": "ecosif.api moviments:write"
}

Modelo de dados (novo)

Artefato Função
Tabela api_client client_id, hash do secret, tenant, roles, scopes, ativo, expiração
Flyway ecosif-auth Migration versionada
Admin / seed Criação de clientes M2M (CLI ou tela MVP4+)

Regras:

Relação com Entra client_credentials

Cenário Caminho
Cliente já usa Entra M2M Modo B ou external-login + ACCESS_TOKEN (já possível)
Cliente sem IdP / VPC interna POST /api/auth/token nativo eCosif
Híbrido Ambos coexistem; gateway pode aceitar JWT ECOSIF (Modo A) ou access token MS (Modo B)

Gate P7-B: app servidor obtém JWT via client_credentials; chama moviments sem signin; secret rotacionado com sucesso.


P7-C — API keys e mTLS na borda

Alinhar especificação deploy multiservidor com o modelo de auth.

API keys (camada gateway)

Aspecto Proposta
Header X-ECOSIF-Api-Key: <key> ou Authorization: ApiKey <key>
Validação Gateway (Traefik ForwardAuth, AWS API Gateway usage plan, Lambda authorizer)
Mapeamento Key → tenant + allowlist de rotas (/ecosif-moviments/api/v1/entries/import)
Emissão Fora do hot path — Secrets Manager / painel ops; não commitar em repo
Combinação API key na borda + JWT ECOSIF ou access token IdP (defense in depth opcional)

Modo mínimo (MVP5): documentação + template Traefik/AWS + variáveis ECOSIF_GWVAL_API_KEY, ECOSIF_API_KEY_HEADER.

Modo completo: validação no ecosif-auth opcional (ECOSIF_AUTH_API_KEY_ENABLED) para ambientes sem gateway dedicado.

mTLS (camada gateway / load balancer)

Aspecto Proposta
Onde ALB/NLB, Traefik, nginx — terminação TLS mutual antes do cluster
Identidade CN ou SAN do certificado cliente → api_client ou allowlist
Combinação mTLS na rede + JWT ou API key na aplicação
Docs Runbook: gerar CA, distribuir cert cliente, renovação

Gate P7-C: checklist deploy com API key ou mTLS em ambiente QAS; rota de importação protegida sem expor signin na internet pública.


P7-D — Multi-IdP (Azure + Google no mesmo ambiente)

Hoje: ECOSIF_AUTH_PROVIDER aceita um provedor externo. MVP5 permite ambos na tela de login e no external-login.

Mudança de modelo

Antes (MVP1) Depois (MVP5)
ECOSIF_AUTH_PROVIDER=AZURE ou GOOGLE Flags independentes: ECOSIF_ENABLE_AZURE_AUTH, ECOSIF_ENABLE_GOOGLE_AUTH
Validators @ConditionalOnExpression único Todos os validators habilitados registrados na factory
external-login.provider deve bater com env único provider no body escolhe validator (já existe no request)

Frontend

Provisionamento

Gate P7-D: homolog com Azure + Google no mesmo .env; mesmo e-mail em ambos IdPs vincula ou não conforme flag.


Variáveis novas (rascunho — env.template)

# --- MVP5 / Fase 7 ---

# Modos B/C (implementação)
ECOSIF_API_TOKEN_MODE=ECOSIF_JWT          # ou AZURE_ENTERPRISE_GATEWAY | GOOGLE_GATEWAY
ECOSIF_GWVAL_ACCESSTOKEN_MS=false
ECOSIF_GWVAL_ACCESSTOKEN_GOOG=false

# client_credentials nativo
ECOSIF_AUTH_CLIENT_CREDENTIALS_ENABLED=false
ECOSIF_AUTH_TOKEN_ENDPOINT=/api/auth/token
ECOSIF_AUTH_CLIENT_CREDENTIALS_DEFAULT_SCOPE=ecosif.api

# Borda
ECOSIF_GWVAL_API_KEY=false
ECOSIF_API_KEY_HEADER=X-ECOSIF-Api-Key
ECOSIF_GWVAL_MTLS=false

# Multi-IdP
ECOSIF_ENABLE_AZURE_AUTH=true
ECOSIF_ENABLE_GOOGLE_AUTH=true
ECOSIF_AUTH_LINK_PROVIDERS_BY_EMAIL=false
# ECOSIF_AUTH_PROVIDER → deprecar em favor das flags; manter compat leitura

Tarefas P7 (programação)

ID Tarefa Módulo Estimativa Depende
P7-01 EcosifOAuth2ResourceServerConfig + factory Modo A/B/C starter-security 3 d LIB-01 ou JAR
P7-02 Integrar Resource Server nos 4 microsserviços Java ×4 2 d P7-01
P7-03 ExternalIdentityUserResolver + link nos serviços auth, database 2 d MVP4 M4-08
P7-04 Angular interceptor Modo B (MSAL access token) angular 2 d P7-01
P7-05 Angular interceptor Modo C (Google token) angular 1,5 d P7-01
P7-06 Docs gateway access token Entra/Google structure 1 d P7-01
P7-07 Migration api_client + entidade JPA auth 1 d
P7-08 POST /api/auth/token client_credentials auth 2 d P7-07
P7-09 CLI/seed criação de api_client + rotação secret auth, structure 1 d P7-08
P7-10 Testes integração client_credentials auth 1 d P7-08
P7-11 Runbook API key (Traefik + AWS) structure 1 d
P7-12 Runbook mTLS (ALB/Traefik) structure 1 d
P7-13 Validators Azure+Google simultâneos auth 1,5 d
P7-14 Angular dual IdP + link por e-mail angular, auth 1,5 d P7-13
P7-15 E2E homolog MVP5 (matriz cenários) QA 2 d P7-01…14
P7-16 OpenAPI + guia integradores M2M auth 1 d P7-08

Estimativa total: ~22 dias úteis (paralelizável em 2–3 sprints).


Matriz de cenários (pós-MVP5)

Cliente Login humano App servidor Gateway
Interno simples Local ou Azure signin ou client_credentials eCosif Modo A JWT ECOSIF
Corporativo Entra SSO Azure Entra M2M → Modo B ou client_credentials eCosif Modo A ou B
Google Workspace SSO Google Service account → Modo C Modo A ou C
Híbrido Azure+Google Ambos botões client_credentials eCosif Modo A + API key na borda
Parceiro VPC mTLS + API key Sem signin público

Critérios de aceite MVP5

  1. Modo B ou C funcional em QAS com gateway validando token IdP e backend em defense in depth.
  2. POST /api/auth/token emite JWT ECOSIF para client_credentials sem usuário/senha gr_user.
  3. Runbooks API key e mTLS publicados; pelo menos um cenário validado em QAS.
  4. Azure e Google habilitados no mesmo ambiente; external-login roteia por provider.
  5. ecosif-automations pode migrar de signin para client_credentials (opcional por cliente).
  6. Documentação integradores atualizada; sem regressão Modo A.

Referências

Documento Conteúdo
../dev/autenticacao_unificada_mvp.md Roadmap MVP1–5
gateway_jwt_ecosif.md Modo A (baseline)
../dev/mvp4_identidade.md Groups/claims, link
variaveis_autenticacao_baseline.md Env baseline
Plano AUTH-01 Parte C Especificação interna detalhada

Decisões em aberto

~~Ver questionário de produto (AUTH-09)~~ — registrado em 2026-07-01 (ver abaixo).


Decisões de produto (2026-07-01)

Respostas do stakeholder — base para escopo MVP5.

Release 1 (obrigatório no primeiro MVP5)

Pilar Incluir Notas
P7-A Modos B/C no código ✅ Sim Cliente opera APIM; eCosif entrega runbooks + Resource Server
P7-B client_credentials nativo ✅ Sim Coexiste com Entra M2M
P7-C API keys / mTLS ⏳ Release 2 Documentar em runbook; implementação após piloto Modo B
P7-D Azure + Google simultâneos ⏳ Release 2 Modelo: um IdP por tenant (botões multi-IdP sem merge de contas)

M2M server-to-server

Decisão Escolha
Estratégia oficial AmbasPOST /api/auth/token (eCosif) ou Entra client_credentials → Modo B / external-login
Gateway Cliente (APIM) — eCosif não hospeda gateway enterprise por padrão
ecosif-automations Por cliente — documentar: signin VPC, client_credentials eCosif, ou Entra M2M

Autorização (além de autenticação)

Modelo alvo em camadas (implementação incremental):

  1. RBAC atualrole + tenant no gr_user (baseline)
  2. Scopes por API/client — claim scope no JWT e em api_client (ex.: moviments:write)
  3. Mapping IdP — groups/claims Entra/Google → tenant/role (MVP4)

Ordem sugerida: RBAC (já existe) → scopes em P7-B → mapping MVP4 ativo em paralelo.

Multi-IdP (Release 2)

Decisão Escolha
Mesmo e-mail Azure + Google Não mergear — cada tenant/cliente usa um IdP
UI com dois botões Oferta de plataforma; config por tenant define qual IdP está ativo

Fases de entrega MVP5

MVP5.1 (Release 1)  → P7-01…P7-10, P7-16  (~14 d)  Modos B/C + client_credentials + authz scopes
MVP5.2 (Release 2)  → P7-11…P7-15           (~8 d)   API key/mTLS runbooks + multi-IdP + E2E completo