Manual de implantação — B2B Entra app-only (AUTH-14)¶
Runbook operacional para habilitar integração machine-to-machine (client_credentials) no perímetro Modo B (AZURE_ENTERPRISE_GATEWAY).
Versão de referência: 0.7.08.202608301 (artefatos Java + starter)
PLANID: AUTH-14 · Homolog formal: AUTH-14.9 (pendente assinatura cliente)
Documentos relacionados¶
| Documento | Uso |
|---|---|
| integracao_b2b_entra_app_only.md | Desenho e contrato técnico |
| checklist_b2b_entra_app_only.md | Checklist Entra + gateway |
| variaveis_autenticacao_baseline.md | Catálogo ECOSIF_* |
| spike_auth14_claims_app_only.md | Claims e diagnóstico 403 |
| auth14_entrega_tecnica_b2b_app_only.md | O que foi implementado |
| identity_provider_link_b2b_app.md | Modelo BD |
1. Pré-requisitos¶
1.1 Ambiente¶
- [ ] Perímetro já em Modo B humano (
ECOSIF_API_TOKEN_MODE=AZURE_ENTERPRISE_GATEWAY) — ver gateway_access_token_entra.md - [ ] PostgreSQL acessível; Flyway meta-repo ≥
V0.7.00.15aplicado - [ ] Imagens/containers Java na versão
0.7.08.202608301ou superior compatível AUTH-14
1.2 Artefatos (versão mínima)¶
| Artefato | Versão |
|---|---|
ecosif-spring-boot-starter-security |
0.7.08.202608301 |
ecosif-database |
0.7.08.202608301 |
ecosif-auth, ecosif-masterdata, ecosif-moviments, ecosif-querys, ecosif-reports |
0.7.08.202608301 |
1.3 Janela e rollback¶
- Implantar primeiro em QAS/homolog; produção somente após AUTH-14.9 assinado.
- Rollback rápido:
ECOSIF_ENABLE_AZURE_APP_ONLY=false(desliga ramo app-only; login humano inalterado). - Perfil Itaú CC (AUTH-14.10): ver manual_implantacao_b2b_itau_sts_cc.md.
- Rollback completo: reverter imagens para versão anterior e remover vínculos B2B se necessário.
2. Flyway (banco)¶
# No pipeline/meta-repo flyway-ecosif — confirmar versão aplicada
# V0.7.00.15__identity_provider_link_b2b_app.sql (comments; sem DDL destrutivo)
- [ ] Migration
V0.7.00.15aplicada no ambiente alvo - [ ] Tabela
identity_provider_linkoperacional (desdeV0.7.00.9)
3. Microsoft Entra ID¶
Seguir checklist_b2b_entra_app_only.md §1.
Resumo:
- API eCosif: App role de aplicação (ex.:
Ecosif.Api.Access). - App integrador: confidential client + secret/cert no vault do cliente.
- Admin consent da application permission.
- Anotar
oiddo service principal do integrador (onboarding eCosif).
Validar STS:
curl -sS -X POST "https://login.microsoftonline.com/${TENANT_ID}/oauth2/v2.0/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "client_id=${INTEGRATOR_CLIENT_ID}" \
-d "client_secret=${INTEGRATOR_CLIENT_SECRET}" \
-d "grant_type=client_credentials" \
-d "scope=api://${API_CLIENT_ID}/.default"
- [ ] HTTP 200 +
access_token - [ ] Payload jwt.ms:
aud,roles,oid,appid/azp; semscpdelegated
4. Variáveis de ambiente (containers Java)¶
Copiar de env.template e docker-compose.yml.
4.1 Compartilhadas Modo B (já existentes)¶
ECOSIF_API_TOKEN_MODE=AZURE_ENTERPRISE_GATEWAY
ECOSIF_AZURE_TENANT_ID=<tenant-guid>
ECOSIF_AZURE_API_AUDIENCE=api://<api-client-id>
4.2 Exclusivas app-only (AUTH-14)¶
# Homolog: true após onboarding; prod: true quando cliente validado
ECOSIF_ENABLE_AZURE_APP_ONLY=true
# CSV — valores exatos das App roles no token
ECOSIF_AZURE_APP_REQUIRED_ROLES=Ecosif.Api.Access
# Produção banco: preencher client id(s) do integrador; homolog pode ficar vazio
ECOSIF_AZURE_APP_ALLOWED_CLIENT_IDS=<appid-integrador>
# Default — não alterar salvo convenção ops
ECOSIF_AZURE_APP_LINK_PROVIDER=AZURE_ENTERPRISE_APP
Aplicar nos 6 serviços Java do compose: ecosif-auth, ecosif-masterdata, ecosif-moviments, ecosif-querys, ecosif-reports (+ auth para API admin).
Não reutilizar para app-only: ECOSIF_AUTH_PROVIDER, ECOSIF_AZURE_SCOPES, ECOSIF_AZURE_EXPECTED_AUDIENCE.
4.3 Ordem de deploy¶
- Flyway
V0.7.00.15 - Publicar imagens
0.7.08.202608301 - Subir containers com vars acima (app-only ainda
falsese quiser smoke de regressão humano primeiro) - Onboarding (§5)
ECOSIF_ENABLE_AZURE_APP_ONLY=true- Testes §7
5. Onboarding no eCosif¶
5.1 Usuário técnico¶
- Criar conta em
gr_user(conta de serviço — username convencionado pelo cliente). - Associar empresa/filial em
gr_filial_usuariovia masterdata (ACL contábil).
5.2 Vínculo app → usuário (recomendado — API)¶
Autentique com JWT ECOSIF (POST /api/auth/signin) e chame ecosif-auth:
curl -sS -X POST "${AUTH_BASE}/api/admin/b2b-app-links" \
-H "Authorization: Bearer ${JWT_ECOSIF}" \
-H "Content-Type: application/json" \
-d '{
"externalId": "<service-principal-oid>",
"userId": <gr_user.id>
}'
| Operação | Método | Path |
|---|---|---|
| Criar | POST |
/api/admin/b2b-app-links |
| Listar | GET |
/api/admin/b2b-app-links |
| Detalhe | GET |
/api/admin/b2b-app-links/{id} |
| Por oid | GET |
/api/admin/b2b-app-links/by-external-id/{oid} |
| Remover | DELETE |
/api/admin/b2b-app-links/{id} |
Documentação integrador: autenticacao.md (seção B2B).
5.3 Alternativa SQL (homolog)¶
Script comentado: seed-b2b-app-link-homolog.sql.
6. API Gateway¶
Seguir checklist_b2b_entra_app_only.md §3 e integracao_b2b_entra_app_only.md §10.
- [ ]
validate-jwt:iss,aud, assinatura — sem exigirscp - [ ] Allowlist
appid/azprecomendada em produção - [ ] JWT ECOSIF (HS256) continua barrado nas rotas
/ecosif-*
7. Validação pós-implantação¶
7.1 Regressão humano (obrigatório)¶
- [ ] Login Azure Enterprise → APIs 200 (mesmo gateway)
7.2 App B2B¶
# Token app-only (§3)
curl -sS -H "Authorization: Bearer ${ACCESS_TOKEN}" \
"${GATEWAY}/ecosif-masterdata/actuator/health"
| Caso | Esperado |
|---|---|
| App vinculado + role OK | 200 em endpoint piloto acordado |
| App sem vínculo | 401 backend (AUTH_IDP_NOT_LINKED ou AUTH_UNAUTHORIZED) |
aud/role inválidos |
401 gateway ou backend |
| JWT ECOSIF no gateway | 401 gateway |
7.3 Logs (sem Bearer completo)¶
ecosif.auth.m2m outcome=success appId=… spOid=… userId=…
ecosif.auth.b2b_onboarding outcome=created linkId=…
ecosif.auth.m2m outcome=denied reason=no_identity_provider_link …
8. Offboarding¶
DELETE /api/admin/b2b-app-links/{id}(ou remover SQL).- Revogar secret/consent do app no Entra (lado cliente).
- Opcional: desativar usuário técnico em
gr_user.
9. Troubleshooting¶
| Sintoma | Causa provável | Ação |
|---|---|---|
| 403 no gateway | Policy exige scp ou allowlist |
Ajustar APIM/AWS; ver spike |
401 + AUTH_IDP_NOT_LINKED |
Sem vínculo AZURE_ENTERPRISE_APP |
Onboarding §5 |
401 + log app_only_disabled |
Flag desligada | ECOSIF_ENABLE_AZURE_APP_ONLY=true |
| 401 role/client | Vars ECOSIF_AZURE_APP_* |
Conferir jwt.ms vs env |
| 403 pós-auth | ACL empresa/filial | gr_filial_usuario do usuário técnico |
| Humano quebrou | Improvável se só B2B vars | Confirmar ECOSIF_AUTH_PROVIDER humano intacto |
10. Referências de implementação¶
Detalhamento técnico completo: auth14_entrega_tecnica_b2b_app_only.md.