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_tokenPOST /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:

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

Google

Comum


Verificação rápida (browser)

  1. Abra DevTools → ApplicationlocalStorage — deve existir chave do JWT ECOSIF após login (sessão/guard).
  2. Network — em ECOSIF_JWT: Authorization: Bearer eyJ... (JWT ECOSIF). Em gateway: token Microsoft/Google conforme modo.
  3. Não deve aparecer signin-azure nem graph.microsoft.com nas requisições de API.

Referências