Configuração de provedores de autenticação (Angular)
Guia para DevOps e desenvolvedores frontend: como habilitar login local, Microsoft Entra ou Google no ecosif-angular via variáveis de ambiente e runtime config.
Modo padrão (MVP1): ECOSIF_API_TOKEN_MODE=ECOSIF_JWT — o Angular envia JWT ECOSIF nas APIs, não o token do IdP.
Modos gateway (P7-04): AZURE_ENTERPRISE_GATEWAY e GOOGLE_GATEWAY — o AuthInterceptor envia o token do IdP nas APIs (access_token MSAL ou id_token Google), mantendo JWT ECOSIF apenas para sessão/guard.
Matriz de provedores
| Cenário | ECOSIF_AUTH_PROVIDER |
UI local | Botão Microsoft | Botão Google |
|---|---|---|---|---|
| Só login local | NONE |
ECOSIF_ENABLE_LOCAL_AUTH=true |
false |
false |
| Local + Microsoft (baseline) | AZURE |
true |
ECOSIF_ENABLE_AZURE_AUTH=true |
false |
| Local + Google | GOOGLE |
true |
false |
ECOSIF_ENABLE_GOOGLE_AUTH=true |
| Azure Enterprise | AZURE_ENTERPRISE |
configurável | true |
false |
Regra MVP1: apenas um provedor externo por ambiente (ECOSIF_AUTH_PROVIDER).
Runtime config (config.json + env.js)
No Docker/ECS, o entrypoint gera assets/config/config.json e assets/env.js a partir das variáveis ECOSIF_*.
Campo config.json |
Variável de ambiente | Efeito |
|---|---|---|
authentication.authProvider |
ECOSIF_AUTH_PROVIDER |
Provedor aceito pelo backend em external-login |
authentication.azureScopes |
ECOSIF_AZURE_SCOPES |
Scopes MSAL (CSV) |
authentication.apiTokenMode |
ECOSIF_API_TOKEN_MODE |
Modo de token nas APIs (ver tabela abaixo) |
authentication.googleAuthMode |
ECOSIF_GOOGLE_AUTH_MODE |
popup ou redirect |
features.enableLocalAuth |
ECOSIF_ENABLE_LOCAL_AUTH |
Formulário usuário/senha |
features.enableAzureAuth |
ECOSIF_ENABLE_AZURE_AUTH |
Botão Microsoft |
features.enableGoogleAuth |
ECOSIF_ENABLE_GOOGLE_AUTH |
Botão Google |
azure.clientId |
ECOSIF_AZURE_CLIENT_ID |
MSAL |
azure.tenantId |
ECOSIF_AZURE_TENANT_ID |
MSAL |
azure.authority |
ECOSIF_AZURE_AUTHORITY |
MSAL authority URL |
google.clientId |
ECOSIF_GOOGLE_CLIENT_ID |
Google Identity Services |
Validação no startup: URLs e token key devem ser iguais entre config.json e env.js.
Modos de token nas APIs (apiTokenMode)
| Valor | Token no Authorization |
Refresh |
|---|---|---|
ECOSIF_JWT (padrão) |
JWT ECOSIF (localStorage) |
GET /user via interceptor |
HYBRID_ECOSIF_AZURE |
JWT ECOSIF ou token Azure cru conforme origem do login | /user (local) ou MSAL silent (Azure) |
AZURE_ENTERPRISE_GATEWAY |
access_token MSAL (acquireTokenSilent) |
MSAL silent; sem /user |
GOOGLE_GATEWAY |
id_token Google (sessionStorage) |
Re-login GIS; sem /user |
Perfil 1 — Local + Microsoft (baseline)
ECOSIF_ENABLE_LOCAL_AUTH=true
ECOSIF_ENABLE_AZURE_AUTH=true
ECOSIF_ENABLE_GOOGLE_AUTH=false
ECOSIF_AUTH_PROVIDER=AZURE
ECOSIF_AZURE_CLIENT_ID=<app-registration-client-id>
ECOSIF_AZURE_TENANT_ID=<tenant-id>
ECOSIF_AZURE_AUTHORITY=https://login.microsoftonline.com/<tenant-id>
ECOSIF_AZURE_SCOPES=openid,profile,email
ECOSIF_API_TOKEN_MODE=ECOSIF_JWT
Fluxo: MSAL popup → id_token → POST /api/auth/external-login → JWT ECOSIF → AuthInterceptor.
Runbook Entra ID: runbook_azure_entra.md.
Perfil 2 — Local + Google
ECOSIF_ENABLE_LOCAL_AUTH=true
ECOSIF_ENABLE_AZURE_AUTH=false
ECOSIF_ENABLE_GOOGLE_AUTH=true
ECOSIF_AUTH_PROVIDER=GOOGLE
ECOSIF_GOOGLE_CLIENT_ID=<client-id>.apps.googleusercontent.com
ECOSIF_GOOGLE_AUTH_MODE=popup
ECOSIF_API_TOKEN_MODE=ECOSIF_JWT
Fluxo: GIS popup → credential (id_token) → external-login → JWT ECOSIF.
Runbook Google: runbook_google_oauth.md.
Perfil 3 — Somente login local
ECOSIF_AUTH_PROVIDER=NONE
ECOSIF_ENABLE_LOCAL_AUTH=true
ECOSIF_ENABLE_AZURE_AUTH=false
ECOSIF_ENABLE_GOOGLE_AUTH=false
Usado por ecosif-automations e integrações que chamam POST /api/auth/signin diretamente.
Perfil 4 — Azure Enterprise Gateway (Modo B)
ECOSIF_AUTH_PROVIDER=AZURE_ENTERPRISE
ECOSIF_ENABLE_AZURE_AUTH=true
ECOSIF_AZURE_SCOPES=openid,profile,email,api://<app-id>/access_as_user
ECOSIF_API_TOKEN_MODE=AZURE_ENTERPRISE_GATEWAY
Fluxo: MSAL popup → external-login com id_token (provisiona usuário) → JWT ECOSIF na sessão → APIs com access_token MSAL via ApiTokenProviderService.
Backends: ECOSIF_API_TOKEN_MODE=AZURE_ENTERPRISE_GATEWAY e ECOSIF_AUTH_PROVIDER=AZURE_ENTERPRISE.
Perfil 5 — Google Gateway (Modo C)
ECOSIF_AUTH_PROVIDER=GOOGLE
ECOSIF_ENABLE_GOOGLE_AUTH=true
ECOSIF_GOOGLE_CLIENT_ID=<client-id>.apps.googleusercontent.com
ECOSIF_API_TOKEN_MODE=GOOGLE_GATEWAY
Fluxo: GIS → external-login → JWT ECOSIF na sessão → id_token Google persistido em sessionStorage → APIs com esse token.
Backends: ECOSIF_API_TOKEN_MODE=GOOGLE_GATEWAY e ECOSIF_AUTH_PROVIDER=GOOGLE.
Perfil 6 — Híbrido ECOSIF + Azure (P7-E)
ECOSIF_ENABLE_LOCAL_AUTH=true
ECOSIF_ENABLE_AZURE_AUTH=true
ECOSIF_AUTH_PROVIDER=AZURE # cenário 2: id_token nas APIs
# ECOSIF_AUTH_PROVIDER=AZURE_ENTERPRISE # cenário 3: access_token nas APIs
ECOSIF_AZURE_SCOPES=openid,profile,email
ECOSIF_API_TOKEN_MODE=HYBRID_ECOSIF_AZURE
# Cenário 3: adicionar api://<client-id>/access_as_user aos scopes e ECOSIF_AZURE_API_AUDIENCE
Fluxo:
- Login local →
sessionStorage.ecosif_session_login_origin=LOCAL→ APIs com JWT ECOSIF (AuthInterceptor+ refresh/user). - Login Microsoft →
external-login(provisiona) → origemAZURE_IDouAZURE_ENTERPRISE→ APIs com token Azure cru (id_tokenouaccess_tokenvia MSAL).
Backends: ECOSIF_API_TOKEN_MODE=HYBRID_ECOSIF_AZURE nos 5 serviços Java (starter 0.7.07.202607081+).
Runbook: gateway_hibrido_ecosif_azure.md.
Componentes no código
| Arquivo | Responsabilidade |
|---|---|
login.component.ts / .html |
UI condicional; dispara MSAL ou GIS |
login.service.ts |
signin() local; externalLogin() para IdPs |
msal-config.ts |
Scopes de ECOSIF_AZURE_SCOPES; protectedResourceMap vazio |
google-auth.service.ts |
GIS popup/redirect |
api-token-mode.ts |
Constantes ECOSIF_JWT, HYBRID_ECOSIF_AZURE, AZURE_ENTERPRISE_GATEWAY, GOOGLE_GATEWAY |
api-token-provider.service.ts |
Resolve Bearer token por modo e origem de login (P7-04 / P7-23) |
idp-token-store.service.ts |
Origem de login + tokens IdP (sessionStorage) |
auth.interceptor.ts |
Modo A/híbrido-local: JWT ECOSIF + refresh /user; Modos B/C/híbrido-Azure: token IdP |
app-config.service.ts |
Carrega config.json no bootstrap |
O MsalInterceptor não envia token Microsoft para APIs /ecosif-* — no Modo B o AuthInterceptor obtém access_token via acquireTokenSilent.
Checklist de deploy
Itens de infra por ambiente (App Registration, secrets no task) permanecem
[ ]até validação no ambiente alvo.
Itens de suporte no produto (código + E2E 2026-07-01) marcados[x].
Microsoft
- [ ] App Registration com Redirect URI SPA = origem do Angular (
https://{dominio}/) - [ ] Três variáveis Azure preenchidas no task/container (
CLIENT_ID,TENANT_ID,AUTHORITY) - [x] Runtime gera
enableAzureAuth/authProvider: "AZURE"viaconfig.template.json+ env-map (código pronto) - [ ] Login popup →
external-login→ dashboard — pendente manual por ambiente
- [ ] OAuth Client Web com Authorized JavaScript origins = origem do SPA
- [ ]
ECOSIF_GOOGLE_CLIENT_IDno container - [x] Runtime gera
enableGoogleAuth/ suporte GIS no login (código pronto) - [ ] GIS popup →
external-login→ dashboard — pendente manual por ambiente
Comum
- [x]
ECOSIF_ENABLE_RUNTIME=truesuportado (entrypoint / env-map; E2E local ✅) - [x] Health auth na tela de login (
auth-health.service.ts; E2E health UP ✅) - [x]
ECOSIF_ANGULAR_AUTH_TOKEN/tokenKeynolocalStorage(token.service.ts)
Verificação rápida (browser)
- Abra DevTools → Application →
localStorage— deve existir chave do JWT ECOSIF após login (sessão/guard). - Network — em
ECOSIF_JWT:Authorization: Bearer eyJ...(JWT ECOSIF). Em gateway: token Microsoft/Google conforme modo. - Não deve aparecer
signin-azurenemgraph.microsoft.comnas requisições de API.
Referências
- variaveis-angular.md — catálogo completo de variáveis ECS/Docker
- frontend-external-login-fase3.md — fluxo técnico Fase 3
- integradores/autenticacao.md — contrato auth
- external-login-api.md
- variaveis_autenticacao_baseline.md
- gateway_access_token_entra.md — Modo B (gateway)
- gateway_access_token_google.md — Modo C (gateway)