Variáveis de autenticação — baseline e mudanças¶
Referência válida (ambiente CRU): .env-dev
Cenário baseline: login da plataforma (usuário/senha) + login via Azure AD simples (ECOSIF_AUTH_PROVIDER=AZURE).
Este documento lista somente variáveis novas ou com comportamento alterado no refactor feat/security-auth-refactor. Variáveis de infra (portas, Postgres, S3, etc.) permanecem como em .env-dev.
Convenção de nomes: variáveis novas de autenticação/gateway usam no máximo 32 caracteres. Prefixo ECOSIF_GWVAL_* para flags de validação no API Gateway.
| Nome atual (≤32) | Nome antigo (não usar) |
|---|---|
ECOSIF_GWVAL_JWT_ECOSIF |
ECOSIF_GATEWAY_VALIDATE_JWT_ECOSIF |
ECOSIF_GWVAL_ACCESSTOKEN_MS |
ECOSIF_GATEWAY_VALIDATE_ACCESS_TOKEN_MICROSOFT |
ECOSIF_GWVAL_ACCESSTOKEN_GOOG |
ECOSIF_GATEWAY_VALIDATE_ACCESS_TOKEN_GOOGLE |
Perfil baseline (não alterar sem motivo)¶
Use estes valores para reproduzir o ambiente atual de desenvolvimento local:
# JWT — igual em auth + 4 microsserviços Java
AUTH_TOKEN_SECRET=<mesmo-secret-em-todos>
TOKEN_EXPIRATION=1800000
ECOSIF_JWT_SUBJECT_CLAIM=username
# UI + provedor
ECOSIF_ENABLE_LOCAL_AUTH=true
ECOSIF_ENABLE_AZURE_AUTH=true
ECOSIF_ENABLE_GOOGLE_AUTH=false
ECOSIF_AUTH_PROVIDER=AZURE
ECOSIF_ENABLE_RUNTIME=true
# Azure AD simples (não Enterprise)
ECOSIF_AZURE_CLIENT_ID=<app-registration-spa>
ECOSIF_AZURE_TENANT_ID=<tenant-id>
ECOSIF_AZURE_AUTHORITY=https://login.microsoftonline.com/<tenant-id>
ECOSIF_AZURE_SCOPES=openid,profile,email
ECOSIF_AZURE_EXPECTED_AUDIENCE= # vazio = usa CLIENT_ID
ECOSIF_AZURE_API_AUDIENCE= # vazio — só Enterprise
ECOSIF_AZURE_EXPECTED_ISSUER= # vazio = derivado do tenant
# Provisionamento no backend (antes era no Angular)
ECOSIF_AUTH_AUTO_PROVISION=true
ECOSIF_AUTH_DEFAULT_TENANT=TEMP_TENANT
ECOSIF_AUTH_DEFAULT_ROLE=STAFF
ECOSIF_AUTH_DEFAULT_CREATED_BY=AZURE_AD
# Modo de token nas APIs (padrão MVP1)
ECOSIF_API_TOKEN_MODE=ECOSIF_JWT
ECOSIF_GWVAL_JWT_ECOSIF=true
Resultado esperado no baseline:
| Ação | Fluxo | Resultado |
|---|---|---|
| Login local | Formulário → POST /api/auth/signin |
JWT ECOSIF no localStorage; APIs com Authorization: Bearer |
| Login Microsoft | Botão Azure → MSAL popup → POST /api/auth/external-login com id_token |
JWT ECOSIF; usuário criado automaticamente se não existir |
| Chamada API | Qualquer microsserviço /ecosif-* |
Backend valida JWT ECOSIF (HS256 + AUTH_TOKEN_SECRET) |
Tabela de mudanças (variável a variável)¶
JWT compartilhado¶
| Variável | O que mudou | Quando usar | Valor no baseline | Resultado esperado |
|---|---|---|---|---|
ECOSIF_JWT_SUBJECT_CLAIM |
Nova. Padroniza o claim sub do JWT em auth, masterdata, querys, etc. |
Sempre que todos os serviços compartilham o mesmo .env |
username |
sub = e-mail do usuário; refresh em GET /user consistente |
TOKEN_EXPIRATION |
Sem mudança de nome; agora documentada como TTL único do JWT ECOSIF | Ajustar tempo de sessão (ms) | 1800000 (30 min) |
Token expira após 30 min; Angular pode renovar via /user |
Provedor e tela de login (Angular)¶
| Variável | O que mudou | Quando usar | Valor no baseline | Resultado esperado |
|---|---|---|---|---|
ECOSIF_AUTH_PROVIDER |
Nova. Substitui o fluxo legado signin-azure / azure: true no signin |
Um valor por ambiente; define qual IdP externo o backend aceita em external-login |
AZURE |
Backend valida id_token Microsoft via JWKS |
ECOSIF_ENABLE_LOCAL_AUTH |
Passou a ser obrigatória no runtime (config.json) |
false = esconde formulário usuário/senha |
true |
Formulário de login visível |
ECOSIF_ENABLE_AZURE_AUTH |
Controla botão Microsoft no Angular (independente do provider em casos edge) | true com ECOSIF_AUTH_PROVIDER=AZURE |
true |
Botão "Entrar com Microsoft" visível |
ECOSIF_ENABLE_GOOGLE_AUTH |
Nova flag de UI para Google GIS | true apenas se ECOSIF_AUTH_PROVIDER=GOOGLE |
false |
Sem botão Google |
ECOSIF_ENABLE_RUNTIME |
Sem mudança; gera config.json no container Angular |
Docker/ECS: true |
true |
Angular lê vars do entrypoint, não só environment.ts |
Azure AD — validação no servidor¶
| Variável | O que mudou | Quando usar | Valor no baseline | Resultado esperado |
|---|---|---|---|---|
ECOSIF_AZURE_SCOPES |
Substitui hardcode user.read no MSAL |
Lista CSV sem espaços; OIDC mínimo para login simples | openid,profile,email |
Popup Microsoft sem scope Graph; id_token válido para external-login |
ECOSIF_AZURE_EXPECTED_AUDIENCE |
Nova. Valida claim aud do id_token no auth |
Vazio = usa ECOSIF_AZURE_CLIENT_ID |
(vazio) | Rejeita token de outra aplicação (401) |
ECOSIF_AZURE_API_AUDIENCE |
Nova. Só para AZURE_ENTERPRISE |
Preencher quando ECOSIF_AUTH_PROVIDER=AZURE_ENTERPRISE |
(vazio) | Não usado no baseline |
ECOSIF_AZURE_EXPECTED_ISSUER |
Nova. Issuer explícito (MVP3) | Tenant custom ou multi-tenant avançado | (vazio) | Issuer derivado: https://login.microsoftonline.com/{tenant}/v2.0 |
Provisionamento de usuário (movido do frontend para o auth)¶
| Variável | O que mudou | Quando usar | Valor no baseline | Resultado esperado |
|---|---|---|---|---|
ECOSIF_AUTH_AUTO_PROVISION |
Antes o Angular criava usuário com senha fixa; agora o auth decide | false em produção restrita (MVP2) |
true |
Primeiro login Azure cria gr_user com tenant/role padrão |
ECOSIF_AUTH_DEFAULT_TENANT |
Antes TEMP_TENANT no login.component.ts |
Todo auto-provision MVP1 | TEMP_TENANT |
Usuário novo vinculado ao tenant padrão |
ECOSIF_AUTH_DEFAULT_ROLE |
Antes STAFF no frontend |
Todo auto-provision MVP1 | STAFF |
Role inicial do usuário novo |
ECOSIF_AUTH_DEFAULT_CREATED_BY |
Nova. Metadado created_by |
Identificar origem do provisionamento | AZURE_AD |
Campo created_by = AZURE_AD no BD |
ECOSIF_AUTH_DEFAULT_EXPIRY_TYPE |
Nova. Campo expiry_type em gr_user |
Ajuste de política de conta | A |
Conta com tipo de expiração "A" |
ECOSIF_AUTH_DEFAULT_EXPIRY_YEARS |
Nova. Validade padrão da conta | Ajuste de política de conta | 1 |
Conta válida ~1 ano |
Rate limit external-login (P4-04)¶
| Variável | O que mudou | Quando usar | Valor no baseline | Resultado esperado |
|---|---|---|---|---|
ECOSIF_AUTH_EXT_LOGIN_RL_EN |
Nova. Liga/desliga rate limit por IP | Produção com IdP externo | true |
Protege contra brute-force no endpoint público |
ECOSIF_AUTH_EXT_LOGIN_RL_MAX |
Nova. Máximo de POST por janela/IP | Ajuste por ambiente | 30 |
Após o limite, HTTP 429 |
ECOSIF_AUTH_EXT_LOGIN_RL_WIN |
Nova. Janela em segundos | Ajuste por ambiente | 60 |
Contador reinicia após a janela |
Modo de token nas APIs e gateway¶
| Variável | O que mudou | Quando usar | Valor no baseline | Resultado esperado |
|---|---|---|---|---|
ECOSIF_API_TOKEN_MODE |
Nova. Define qual token trafega em Authorization nas APIs |
Baseline e maioria dos clientes | ECOSIF_JWT |
Angular envia JWT ECOSIF (não o token Microsoft) |
ECOSIF_GWVAL_JWT_ECOSIF |
Nova. Flag de documentação/ops para gateway (≤32 chars) | Traefik, API Gateway, ALB | true |
Gateway deve validar HS256 com AUTH_TOKEN_SECRET |
ECOSIF_GWVAL_ACCESSTOKEN_MS |
Nova. Gateway valida access token Microsoft (Modo B) | ECOSIF_API_TOKEN_MODE=AZURE_ENTERPRISE_GATEWAY |
false |
Ver gateway_access_token_entra.md |
ECOSIF_GWVAL_ACCESSTOKEN_GOOG |
Nova. Gateway valida token Google (Modo C) | ECOSIF_API_TOKEN_MODE=GOOGLE_GATEWAY |
false |
Ver gateway_access_token_google.md |
Valores adicionais de ECOSIF_API_TOKEN_MODE:
| Valor | Uso |
|---|---|
HYBRID_ECOSIF_AZURE |
Login local → JWT ECOSIF nas APIs; login Microsoft → token Azure cru (id_token ou access token conforme ECOSIF_AUTH_PROVIDER). Ver gateway_hibrido_ecosif_azure.md. |
OAuth2 legado nos microsserviços Java¶
| Variável | O que mudou | Quando usar | Valor no baseline | Resultado esperado |
|---|---|---|---|---|
SPRING_AUTOCONFIGURE_EXCLUDE |
Recomendado desligar OAuth2 client Spring não usado | Quando AUTH2_CLIENT_ID está vazio |
org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration |
Sem redirect Google server-side nos backends |
Cenários além do baseline (quando mudar)¶
Só login local (sem Azure)¶
ECOSIF_AUTH_PROVIDER=NONE
ECOSIF_ENABLE_AZURE_AUTH=false
ECOSIF_ENABLE_LOCAL_AUTH=true
Resultado: apenas formulário usuário/senha; ecosif-automations continua usando POST /api/auth/signin.
Azure Enterprise + gateway (Modo B)¶
ECOSIF_AUTH_PROVIDER=AZURE_ENTERPRISE
ECOSIF_API_TOKEN_MODE=AZURE_ENTERPRISE_GATEWAY
ECOSIF_AZURE_SCOPES=openid,profile,email,api://<client-id>/access_as_user
ECOSIF_AZURE_API_AUDIENCE=api://<client-id>
ECOSIF_GWVAL_JWT_ECOSIF=false
ECOSIF_GWVAL_ACCESSTOKEN_MS=true
Quando: cliente com APIM/WAF que só aceita access token Entra.
Resultado: login com id_token em external-login; APIs com access token Microsoft. Ver gateway_access_token_entra.md.
B2B Entra app-only — Modo B + AUTH-14 (integração M2M)¶
Mesmo perímetro gateway (AZURE_ENTERPRISE_GATEWAY), sem login humano. Variáveis de validação/resolução app-only são exclusivas — não reutilizar ECOSIF_AUTH_PROVIDER, ECOSIF_AZURE_SCOPES nem ECOSIF_AZURE_EXPECTED_AUDIENCE para o ramo B2B.
# Perímetro (compartilhado Modo B)
ECOSIF_API_TOKEN_MODE=AZURE_ENTERPRISE_GATEWAY
ECOSIF_AZURE_TENANT_ID=<tenant-id>
ECOSIF_AZURE_API_AUDIENCE=api://<api-client-id>
ECOSIF_GWVAL_JWT_ECOSIF=false
ECOSIF_GWVAL_ACCESSTOKEN_MS=true
# App-only — exclusivas (starter; default até homolog AUTH-14)
ECOSIF_ENABLE_AZURE_APP_ONLY=false
ECOSIF_AZURE_APP_REQUIRED_ROLES=Ecosif.Api.Access
ECOSIF_AZURE_APP_ALLOWED_CLIENT_IDS=<integrator-app-id>
ECOSIF_AZURE_APP_LINK_PROVIDER=AZURE_ENTERPRISE_APP
| Variável | O que mudou | Quando usar | Default homolog | Resultado esperado |
|---|---|---|---|---|
ECOSIF_ENABLE_AZURE_APP_ONLY |
Nova (AUTH-14). Liga ramo app-only no starter | Cliente banco com STS client_credentials |
false |
true + vínculo → APIs 200; false → app-only continua 401/403 |
ECOSIF_AZURE_APP_REQUIRED_ROLES |
Nova. CSV de App roles Entra | Backend valida claim roles |
(vazio) | Token sem role exigida → 401 |
ECOSIF_AZURE_APP_ALLOWED_CLIENT_IDS |
Nova. Allowlist appid/azp |
Produção banco; espelhar no gateway | (vazio) | Client id fora da lista → 401 |
ECOSIF_AZURE_APP_LINK_PROVIDER |
Nova. Provider em identity_provider_link |
Onboarding app → usuário técnico | AZURE_ENTERPRISE_APP |
Lookup separado de pessoa (AZURE_ENTERPRISE) |
Quando: sistema externo chama APIs com token de aplicação (sem MSAL / sem external-login).
Resultado: integrador obtém token no STS Entra → Authorization: Bearer nas APIs → eCosif resolve app → usuário técnico → ACL empresa/filial. Ver integracao_b2b_entra_app_only.md.
Status implementação: implementado no starter 0.7.08.202608301 (AUTH-14.3); ligar com ECOSIF_ENABLE_AZURE_APP_ONLY=true após onboarding — ver manual_implantacao_b2b_entra_app_only.md.
B2B Itaú STS — CC + scope (AUTH-14.10)¶
Perfil Itaú: integrador em openid.itau.com.br com claim scope (mesmos nomes QW4), sem App role Entra. Humano permanece somente Azure. Um token STS → todas as APIs Java (sem hop no auth).
# M2M — reutiliza flag e provider AUTH-14
ECOSIF_ENABLE_AZURE_APP_ONLY=true
ECOSIF_AZURE_APP_LINK_PROVIDER=AZURE_ENTERPRISE_APP
ECOSIF_AZURE_APP_REQUIRED_ROLES= # vazio — Itaú não usa roles
ECOSIF_AZURE_APP_REQUIRED_SCOPES=qw4-balancetes-fundos-investimentos.read
ECOSIF_AZURE_APP_ALLOWED_CLIENT_IDS=<sub-integrador> # client id lambda por ambiente
# Itaú STS — exclusivas AUTH-14.10
ECOSIF_ITAU_STS_ISSUER=https://openid.itau.com.br/api/oauth/token
ECOSIF_ITAU_STS_JWKS_URI=<confirmar-cliente>
ECOSIF_ITAU_STS_AUDIENCE_MODE=NONE # emissor Itaú não envia aud (default)
| Variável | O que mudou | Quando usar | Default | Resultado |
|---|---|---|---|---|
ECOSIF_AZURE_APP_REQUIRED_SCOPES |
Nova (14.10). CSV scopes no claim scope |
Perfil Itaú CC | (vazio) | Scope ausente → 401 |
ECOSIF_ITAU_STS_ISSUER |
Nova (14.10). Issuer STS Itaú | Multi-issuer backend | (vazio) | Token Itaú rejeitado se ausente |
ECOSIF_ITAU_STS_JWKS_URI |
Nova (14.10). JWKS Itaú | Validação assinatura | (vazio) | 401 JWT inválido |
ECOSIF_ITAU_STS_AUDIENCE_MODE |
Nova (14.10). Modo aud |
Valor NONE |
NONE |
Emissor não envia aud; use SUB_EQUALS_AUD só se o token tiver aud=sub |
Onde replicar: ecosif-auth, ecosif-masterdata, ecosif-moviments, ecosif-querys, ecosif-reports — matriz em checklist_vars_terraform_b2b_java.md.
Status implementação: planejado (AUTH-14.10) — ver integracao_b2b_itau_sts_cc.md.
Google Gateway (Modo C)¶
ECOSIF_AUTH_PROVIDER=GOOGLE
ECOSIF_API_TOKEN_MODE=GOOGLE_GATEWAY
ECOSIF_GWVAL_JWT_ECOSIF=false
ECOSIF_GWVAL_ACCESSTOKEN_GOOG=true
Resultado: login e APIs com token Google. Ver gateway_access_token_google.md.
Híbrido ECOSIF + Azure (P7-E — cenários 1, 2 e 3)¶
ECOSIF_ENABLE_LOCAL_AUTH=true
ECOSIF_ENABLE_AZURE_AUTH=true
ECOSIF_AUTH_PROVIDER=AZURE # cenário 2: id_token nas APIs (aud = client-id)
# ECOSIF_AUTH_PROVIDER=AZURE_ENTERPRISE # cenário 3: access token nas APIs
ECOSIF_API_TOKEN_MODE=HYBRID_ECOSIF_AZURE
ECOSIF_AZURE_SCOPES=openid,profile,email # cenário 2
# ECOSIF_AZURE_SCOPES=openid,profile,email,api://<client-id>/access_as_user # cenário 3
# ECOSIF_AZURE_API_AUDIENCE=api://<client-id> # obrigatório no cenário 3 (backends)
Quando: mesmo ambiente precisa aceitar login local (JWT ECOSIF) e login Microsoft (SSO com token Azure cru), sem troca de token na sessão.
Resultado: external-login provisiona no primeiro login Azure; APIs autenticam HS256 (local) ou RS256 (Azure) na mesma rota. Ver gateway_hibrido_ecosif_azure.md.
Google Workspace¶
ECOSIF_AUTH_PROVIDER=GOOGLE
ECOSIF_ENABLE_GOOGLE_AUTH=true
ECOSIF_ENABLE_AZURE_AUTH=false
ECOSIF_GOOGLE_CLIENT_ID=<oauth-web-client>
ECOSIF_GOOGLE_EXPECTED_AUDIENCE= # vazio = CLIENT_ID
ECOSIF_GOOGLE_AUTH_MODE=popup
Resultado: botão Google GIS → external-login com id_token Google.
Desligar auto-criação de usuário (MVP2 / homologação restrita)¶
ECOSIF_AUTH_AUTO_PROVISION=false
Resultado: login externo de usuário não cadastrado → HTTP 404 (não cria conta).
O que não existe mais (comportamento removido)¶
| Antes | Agora | Impacto se não atualizar o cliente |
|---|---|---|
POST /api/auth/signin-azure com { username } |
POST /api/auth/external-login com { provider, token } |
Login Azure falha (404/400) |
POST /api/auth/signin com azure: true |
Mesmo endpoint retorna 400 | Integração antiga quebra |
Angular createAzureLoginUser() + senha "123456" |
ECOSIF_AUTH_AUTO_PROVISION no auth |
Não enviar mais userCreate do frontend |
MSAL scope fixo user.read |
ECOSIF_AZURE_SCOPES |
Usar OIDC; Graph só se explicitamente necessário |
Checklist rápido — baseline funcionando¶
Status plataforma eCosif (.env-dev / Modo A): concluído. Itens 2–3 dependem do IdP habilitado no ambiente.
- [x]
AUTH_TOKEN_SECRETidêntico em auth, masterdata, moviments, querys, reports e Angular (ECOSIF_ANGULAR_AUTH_TOKENvazio = herda no compose). - [x]
ECOSIF_AUTH_PROVIDER=AZUREe IDs Azure preenchidos (baseline.env-dev). - [x]
ECOSIF_ENABLE_LOCAL_AUTH=trueeECOSIF_ENABLE_AZURE_AUTH=true. - [x]
docker composesobe com.env-dev(ou cópia.env.full.example). - [x] Login Microsoft → rede mostra
POST .../external-login(nãosignin-azure). - [x] Após login, chamadas às APIs levam header
Authorization: Bearer <jwt_ecosif>.
Referências¶
| Documento | Conteúdo |
|---|---|
| ../dev/autenticacao_unificada_mvp.md | Visão geral MVP1–4 |
| gateway_jwt_ecosif.md | Modo A — JWT ECOSIF no gateway |
| gateway_access_token_entra.md | Modo B — access token Microsoft |
| integracao_b2b_entra_app_only.md | B2B app-only Entra (AUTH-14) |
| manual_implantacao_b2b_entra_app_only.md | Runbook implantação B2B |
| auth14_entrega_tecnica_b2b_app_only.md | Entrega técnica AUTH-14 |
| gateway_access_token_google.md | Modo C — token Google |
| external-login-api.md | Contrato HTTP external-login |
| external-login-backend.md | Implementação Fase 2 (validators, testes) |
.env-dev |
Ambiente CRU válido (local + Azure simples) |
env.template |
Template vazio com defaults documentados |