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) | A — ECOSIF_JWT + gateway_jwt_ecosif.md |
| Cliente exige token Google na borda (Workspace / política corporativa) | C — GOOGLE_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.yml → ecosif.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 | sub → identity_provider_link no backend |
Rotas públicas (sem token Google)
POST */api/auth/external-loginPOST */api/auth/signin(seECOSIF_ENABLE_LOCAL_AUTH=true)GET */actuator/health*- Assets do Angular (
/,/assets/*)
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)
- JWT Authorizer:
- Issuer:
https://accounts.google.com- Audience:{ECOSIF_GOOGLE_CLIENT_ID} - Associar às rotas
/ecosif-*. - Excluir
external-login,signine 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 |
Lê 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
- [ ] OAuth Client Web com Authorized JavaScript origins corretas
- [ ]
ECOSIF_API_TOKEN_MODE=GOOGLE_GATEWAYem Angular + 5 backends - [ ]
ECOSIF_GWVAL_ACCESSTOKEN_GOOG=trueeECOSIF_GWVAL_JWT_ECOSIF=falseno gateway - [ ] Login Google →
external-loginretorna 200 + JWT ECOSIF - [ ]
sessionStoragecontémecosif_google_id_tokenapós login - [ ] Chamada autenticada à API → 200 com token Google no header
- [ ] Mesma chamada com JWT ECOSIF → 401
- [ ] Após ~1 h (ou token revogado) → 401 e redirect para login
Verificação no browser
external-login: credential Google (id_token)- APIs:
Authorization: Bearer eyJ...comaud= Client ID eiss=accounts.google.com
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 |