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-logincom{ 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(chaveECOSIF_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: trueno signin não é usado pelo frontend — E2E ✅ - [x] MsalInterceptor não envia token Microsoft para
/ecosif-masterdata/—protectedResourceMapvazio - [x]
config.jsoncontémauthProvider,azureScopes,apiTokenMode— E2E ✅
Critérios de aceite (Fase 3)
- [x]
external-loginno lugar designin-azure - [x] Scopes MSAL configuráveis (
ECOSIF_AZURE_SCOPES) - [x] Sem
graph.microsoft.comno interceptor MSAL - [x]
apiTokenModeno runtime config (defaultECOSIF_JWT) - [ ] Checklist E2E executado em homolog (manual) — ver frontend-external-login-fase3-e2e-2026-07-01.md (API/regressões ✅; popup Microsoft ⏭️ manual)