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:
- Starter:
SecurityFilterChainFactoryescolhe filtro porECOSIF_API_TOKEN_MODE - Microsserviços: resolver usuário via
oid/sub→identity_provider_link→gr_user - Angular Modo B: interceptor envia access token MSAL (
acquireTokenSilent), não JWT ECOSIF - Angular Modo C: interceptor envia token GIS
- Docs: gateway_access_token_entra.md, gateway_access_token_google.md ✅ P7-06
- Traefik / API Gateway: exemplos com
ECOSIF_GWVAL_ACCESSTOKEN_MS/_GOOG
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:
- Secret armazenado com hash (bcrypt ou Argon2) — nunca em texto claro no banco
- JWT ECOSIF emitido com claims de serviço (
sub=client_idou usuário técnico vinculado) - Rotacionar secret sem downtime (dois secrets ativos por janela)
- Rate limit por
client_id(reutilizar P4-04 se existir) - Logs:
client_id,grant_type— sem secret
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
- Login exibe botão Microsoft e Google quando ambos
true AppConfig:azureClientId+googleClientIdsimultâneos- Mesmo
apiTokenMode(Modo A ou B/C) para ambos
Provisionamento
- Mesmo usuário com e-mails iguais em Azure e Google: política configurável
ECOSIF_AUTH_LINK_PROVIDERS_BY_EMAIL=true→ umgr_user, doisidentity_provider_linkfalse→ contas separadas (padrão conservador)
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
- Modo B ou C funcional em QAS com gateway validando token IdP e backend em defense in depth.
POST /api/auth/tokenemite JWT ECOSIF paraclient_credentialssem usuário/senhagr_user.- Runbooks API key e mTLS publicados; pelo menos um cenário validado em QAS.
- Azure e Google habilitados no mesmo ambiente;
external-loginroteia porprovider. ecosif-automationspode migrar designinparaclient_credentials(opcional por cliente).- 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 | Ambas — POST /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):
- RBAC atual —
role+tenantnogr_user(baseline) - Scopes por API/client — claim
scopeno JWT e emapi_client(ex.:moviments:write) - 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