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.

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.

  1. [x] AUTH_TOKEN_SECRET idêntico em auth, masterdata, moviments, querys, reports e Angular (ECOSIF_ANGULAR_AUTH_TOKEN vazio = herda no compose).
  2. [x] ECOSIF_AUTH_PROVIDER=AZURE e IDs Azure preenchidos (baseline .env-dev).
  3. [x] ECOSIF_ENABLE_LOCAL_AUTH=true e ECOSIF_ENABLE_AZURE_AUTH=true.
  4. [x] docker compose sobe com .env-dev (ou cópia .env.full.example).
  5. [x] Login Microsoft → rede mostra POST .../external-login (não signin-azure).
  6. [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
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