Pular para conteúdo

Frontend — external-login (Fase 3)

Integração Angular com POST /api/auth/external-login e JWT ECOSIF nas APIs de negócio.

Baseline: .env-dev em ecosif-structure (ECOSIF_AUTH_PROVIDER=AZURE, login local + Microsoft).

Fluxo baseline (Modo A — ECOSIF_API_TOKEN_MODE=ECOSIF_JWT)

Login local     → LoginService.login()        → POST /api/auth/signin
Login Microsoft → MSAL popup → idToken        → POST /api/auth/external-login
Login Google    → GIS popup  → idToken        → POST /api/auth/external-login

APIs /ecosif-*  → AuthInterceptor             → Authorization: Bearer <JWT_ECOSIF>

O MsalInterceptor não anexa token Microsoft às APIs ECOSIF (protectedResourceMap vazio).

Componentes

Arquivo Função
login.component.ts UI condicional; MSAL/GIS → externalLogin(idToken)
login.service.ts externalLogin({ provider, token, tokenType })
google-auth.service.ts Google Identity Services (popup/redirect)
auth.interceptor.ts JWT ECOSIF; ignora signin e external-login
msal-config.ts Scopes de ECOSIF_AZURE_SCOPES; sem Graph
app-config.service.ts Runtime: authProvider, azureScopes, apiTokenMode

Runtime (config.json + env.js)

Gerados pelo entrypoint Docker a partir de ECOSIF_*:

Campo config Variável
authentication.authProvider ECOSIF_AUTH_PROVIDER
authentication.azureScopes ECOSIF_AZURE_SCOPES
authentication.apiTokenMode ECOSIF_API_TOKEN_MODE
features.enableLocalAuth ECOSIF_ENABLE_LOCAL_AUTH
features.enableAzureAuth ECOSIF_ENABLE_AZURE_AUTH
features.enableGoogleAuth ECOSIF_ENABLE_GOOGLE_AUTH

Checklist E2E (homolog / .env-dev)

Preparação

cd ecosif-structure
docker compose --env-file .env-dev build ecosif-auth ecosif-angular ecosif-masterdata
docker compose --env-file .env-dev up -d

Login local

  • [x] Formulário visível (ECOSIF_ENABLE_LOCAL_AUTH=true) — código + E2E 2026-07-01 ✅
  • [x] POST .../api/auth/signin → 200 + accessToken — E2E 2026-07-01 ✅
  • [x] Navegação ao dashboard — implementado em login.component.ts (navigateByUrl('/dashboard')); SPA visual não automatizado no E2E
  • [x] Chamada autenticada (ex. masterdata) com Authorization: Bearer — E2E 2026-07-01 ✅

Login Microsoft (baseline)

  • [x] Botão Microsoft visível — código + string no bundle (E2E ✅)
  • [ ] Popup Entra ID com scopes openid,profile,email (sem Graph) — pendente manual no browser
  • [ ] Rede: POST .../api/auth/external-login com { provider: "AZURE", token: "<id_token>" } — endpoint validado (401 c/ token inválido); fluxo completo pendente manual
  • [x] Não deve aparecer signin-azure — backend 404; FE não chama (E2E ✅)
  • [ ] JWT ECOSIF no localStorage (chave ECOSIF_ANGULAR_AUTH_TOKEN / tokenKey) — código pronto (token.service.ts); gravação pós-login Microsoft pendente manual
  • [ ] Usuário novo → auto-provision (TEMP_TENANT / STAFF) — suporte backend; validação com usuário novo pendente manual

Regressões

  • [x] azure: true no signin não é usado pelo frontend — E2E ✅
  • [x] MsalInterceptor não envia token Microsoft para /ecosif-masterdata/protectedResourceMap vazio
  • [x] config.json contém authProvider, azureScopes, apiTokenMode — E2E ✅

Critérios de aceite (Fase 3)

  • [x] external-login no lugar de signin-azure
  • [x] Scopes MSAL configuráveis (ECOSIF_AZURE_SCOPES)
  • [x] Sem graph.microsoft.com no interceptor MSAL
  • [x] apiTokenMode no runtime config (default ECOSIF_JWT)
  • [ ] Checklist E2E executado em homolog (manual) — ver frontend-external-login-fase3-e2e-2026-07-01.md (API/regressões ✅; popup Microsoft ⏭️ manual)

Referências