Gateway — token Google (Modo C)

Guia para DevOps e clientes que exigem token Google validado no API Gateway, em vez do JWT ECOSIF (Modo A).

Código tarefa: AUTH-09 · P7-06
Público: administradores GCP, DevOps, arquitetos de integração
Pré-requisitos: OAuth Client Web configurado (ver runbook Google OAuth)


Quando usar

Cenário Modo
Gateway aceita JWT ECOSIF (secret compartilhado) AECOSIF_JWT + gateway_jwt_ecosif.md
Cliente exige token Google na borda (Workspace / política corporativa) CGOOGLE_GATEWAY

Regra: ECOSIF_API_TOKEN_MODE e ECOSIF_AUTH_PROVIDER devem estar alinhados em Angular, backends e gateway.


Visão geral do fluxo

Login (uma vez)
  Angular/GIS popup → id_token (credential)
  → POST /api/auth/external-login { provider: "GOOGLE", token: "<id_token>" }
  → ecosif-auth valida JWKS Google, provisiona gr_user + identity_provider_link
  → resposta { accessToken: <JWT_ECOSIF> }  ← sessão/guard Angular apenas
  → Angular persiste id_token em sessionStorage (Modo C)

APIs de negócio (cada requisição)
  Angular envia id_token Google armazenado
  → Authorization: Bearer <id_token>
  → API Gateway valida JWKS Google (aud, iss, exp)
  → microsserviço valida o mesmo token (OAuth2 Resource Server)
  → resolve usuário: claim sub → identity_provider_link → gr_user

No Modo C o mesmo id_token do GIS é usado no login e nas APIs (até expirar, ~1 h). Não há refresh silencioso — o usuário refaz login GIS quando expira.


Variáveis de ambiente

Stack completa (compose / ECS)

# Modo C — obrigatório alinhar em todos os serviços + Angular
ECOSIF_API_TOKEN_MODE=GOOGLE_GATEWAY
ECOSIF_AUTH_PROVIDER=GOOGLE

# Gateway — documentação/ops (≤32 chars)
ECOSIF_GWVAL_JWT_ECOSIF=false
ECOSIF_GWVAL_ACCESSTOKEN_GOOG=true

# Google
ECOSIF_GOOGLE_CLIENT_ID=<oauth-web-client-id>.apps.googleusercontent.com
ECOSIF_GOOGLE_AUTH_MODE=popup
ECOSIF_GOOGLE_EXPECTED_ISSUER=https://accounts.google.com
# ECOSIF_GOOGLE_EXPECTED_AUDIENCE vazio = mesmo valor que CLIENT_ID (ecosif-auth)

# Angular
ECOSIF_ENABLE_GOOGLE_AUTH=true
ECOSIF_ENABLE_AZURE_AUTH=false
ECOSIF_ENABLE_LOCAL_AUTH=false   # típico em SSO obrigatório

Backends Java (application.ymlecosif.security.*)

Propriedade Variável Descrição
ecosif.security.api-token-mode ECOSIF_API_TOKEN_MODE GOOGLE_GATEWAY
ecosif.security.auth-provider ECOSIF_AUTH_PROVIDER GOOGLE
ecosif.security.google.client-id ECOSIF_GOOGLE_CLIENT_ID aud esperado no token
ecosif.security.google.issuer ECOSIF_GOOGLE_EXPECTED_ISSUER iss esperado (default accounts.google.com)

Microsserviços afetados: ecosif-auth, ecosif-masterdata, ecosif-moviments, ecosif-querys, ecosif-reports.


Validação no gateway

Parâmetros JWT (id_token Google)

Claim / parâmetro Valor
Algoritmo RS256
JWKS https://www.googleapis.com/oauth2/v3/certs
Issuer (iss) https://accounts.google.com
Audience (aud) ECOSIF_GOOGLE_CLIENT_ID
Identidade subidentity_provider_link no backend

Rotas públicas (sem token Google)

Rotas protegidas

Todas as demais sob /ecosif-* exigem Authorization: Bearer <id_token> válido.

Defense in depth: gateway e microsserviços validam o mesmo token.


Google Cloud / API Gateway externo

A maioria dos gateways corporativos aceita validação OIDC com JWKS Google:

Parâmetro Valor
Issuer https://accounts.google.com
JWKS URI https://www.googleapis.com/oauth2/v3/certs
Audience OAuth Client ID (Web)

AWS API Gateway (HTTP API)

  1. JWT Authorizer: - Issuer: https://accounts.google.com - Audience: {ECOSIF_GOOGLE_CLIENT_ID}
  2. Associar às rotas /ecosif-*.
  3. Excluir external-login, signin e health.

Traefik (referência)

Middleware JWT com jwksUrl = https://www.googleapis.com/oauth2/v3/certs, issuer = https://accounts.google.com, audience = Client ID.


Frontend (Angular)

Componente Comportamento Modo C
login.component.ts GIS → external-login + IdpTokenStoreService.saveGoogleIdToken
api-token-provider.service.ts id_token de sessionStorage
auth.interceptor.ts Envia token Google; sem refresh via GET /user
Sessão / AuthGuard JWT ECOSIF em localStorage após external-login

Guia frontend: configuracao_provedores.md — Perfil 5.

Expiração do id_token

Tokens GIS expiram em ~1 hora. Ao receber 401 nas APIs, o Angular redireciona para login — não há acquireTokenSilent equivalente ao MSAL.


Checklist de homologação

  1. [ ] OAuth Client Web com Authorized JavaScript origins corretas
  2. [ ] ECOSIF_API_TOKEN_MODE=GOOGLE_GATEWAY em Angular + 5 backends
  3. [ ] ECOSIF_GWVAL_ACCESSTOKEN_GOOG=true e ECOSIF_GWVAL_JWT_ECOSIF=false no gateway
  4. [ ] Login Google → external-login retorna 200 + JWT ECOSIF
  5. [ ] sessionStorage contém ecosif_google_id_token após login
  6. [ ] Chamada autenticada à API → 200 com token Google no header
  7. [ ] Mesma chamada com JWT ECOSIF → 401
  8. [ ] Após ~1 h (ou token revogado) → 401 e redirect para login

Verificação no browser


Troubleshooting

Sintoma Causa provável Ação
401 imediato após login Token não persistido Verificar ecosif_google_id_token em sessionStorage
aud inválido Client ID divergente Mesmo ECOSIF_GOOGLE_CLIENT_ID em Angular e backends
401 só no backend Modo A no Java ECOSIF_API_TOKEN_MODE=GOOGLE_GATEWAY no container
origin_mismatch no GIS Origem não cadastrada Authorized JavaScript origins no GCP
Usuário não mapeado Sem link identity_provider_link após primeiro external-login

Comparativo rápido Modo B vs C

Modo B (Entra) Modo C (Google)
Token nas APIs Access token (api://...) ID token (Client ID)
JWKS login.microsoftonline.com googleapis.com/oauth2/v3/certs
Refresh MSAL acquireTokenSilent Re-login GIS
Doc gateway gateway_access_token_entra.md Este documento

Referências

Documento Conteúdo
gateway_jwt_ecosif.md Modo A — JWT ECOSIF
gateway_access_token_entra.md Modo B — Microsoft
variaveis_autenticacao_baseline.md Catálogo ECOSIF_*
runbook_google_oauth.md OAuth Client GCP
configuracao_provedores.md Angular Modo C
mvp5_integracao_avancada.md Fase 7 / AUTH-09