Runbook — Google OAuth (Identity Services)
Guia operacional para DevOps e clientes que habilitam login Google no eCosif (MVP1 Modo A — ECOSIF_API_TOKEN_MODE=ECOSIF_JWT).
Público: administradores GCP, DevOps, integradores.
Pré-requisitos: domínio do SPA Angular publicado.
Visão geral do fluxo
Usuário → botão Google (Angular/GIS) → popup Google Identity Services → id_token (credential)
→ POST /api/auth/external-login { provider: "GOOGLE", token: "<id_token>" }
→ ecosif-auth valida JWKS Google → JWT ECOSIF
→ APIs /ecosif-* com Authorization: Bearer <JWT_ECOSIF>
Apenas um provedor externo por ambiente (ECOSIF_AUTH_PROVIDER=GOOGLE). Não combine Azure e Google no mesmo ambiente.
1. Criar projeto no Google Cloud
- Acesse console.cloud.google.com.
- Select a project → New Project → nome ex.:
eCosif Auth. - Anote o Project ID (referência interna; não é variável eCosif).
Habilitar APIs (se solicitado)
Para login OIDC com GIS, normalmente não é necessário habilitar APIs adicionais além da configuração OAuth. Se o console exigir, habilite Google Identity Services.
2. Configurar OAuth consent screen
- APIs & Services → OAuth consent screen.
- User Type: - Internal — apenas usuários do Google Workspace da organização. - External — contas Gmail / domínios externos (requer verificação para produção).
- Preencha App name, User support email, Developer contact.
- Scopes: adicione apenas escopos OIDC básicos (
openid,email,profile) — o GIS solicitaid_tokencom esses claims.
3. Criar OAuth Client (Web application)
- APIs & Services → Credentials → Create Credentials → OAuth client ID.
- Application type: Web application.
- Name:
eCosif SPA. - Authorized JavaScript origins (obrigatório para GIS popup):
| Ambiente | Origem |
|---|---|
| Local | http://localhost:8080 |
| QAS | https://qas.{cliente}.com.br |
| Produção | https://app.{cliente}.com.br |
Use origem sem path — apenas scheme + host + porta.
-
Authorized redirect URIs: - Para modo popup (
ECOSIF_GOOGLE_AUTH_MODE=popup): geralmente não é necessário URI de redirect adicional (GIS usa callback JS). - Para modo redirect (ECOSIF_GOOGLE_AUTH_MODE=redirect): adicionehttps://{dominio}/e rotas de callback configuradas no Angular. -
Copie o Client ID →
ECOSIF_GOOGLE_CLIENT_ID.
Não exponha o Client Secret no frontend — o fluxo GIS usa apenas o Client ID público.
4. Variáveis de ambiente eCosif
Angular (UI + GIS)
| Variável | Obrigatória | Descrição |
|---|---|---|
ECOSIF_ENABLE_GOOGLE_AUTH |
Sim | true — exibe botão Google |
ECOSIF_GOOGLE_CLIENT_ID |
Sim | OAuth Client ID (Web) |
ECOSIF_GOOGLE_AUTH_MODE |
Recomendado | popup (padrão) ou redirect |
ECOSIF_ENABLE_LOCAL_AUTH |
Opcional | true/false — formulário local |
Backend (ecosif-auth)
| Variável | Obrigatória | Descrição |
|---|---|---|
ECOSIF_AUTH_PROVIDER |
Sim | GOOGLE |
ECOSIF_GOOGLE_CLIENT_ID |
Sim | Mesmo Client ID do SPA |
ECOSIF_GOOGLE_EXPECTED_AUDIENCE |
Não | Vazio = usa CLIENT_ID |
ECOSIF_GOOGLE_EXPECTED_ISSUER |
Não | Padrão https://accounts.google.com |
ECOSIF_AUTH_AUTO_PROVISION |
Recomendado | true |
ECOSIF_AUTH_DEFAULT_TENANT |
Se auto-provision | Ex.: TEMP_TENANT |
ECOSIF_AUTH_DEFAULT_ROLE |
Se auto-provision | Ex.: STAFF |
ECOSIF_AUTH_DEFAULT_CREATED_BY |
Opcional | Ex.: GOOGLE |
Desabilitar Azure no mesmo ambiente
ECOSIF_ENABLE_AZURE_AUTH=false
ECOSIF_AUTH_PROVIDER=GOOGLE
ECOSIF_ENABLE_GOOGLE_AUTH=true
JWT compartilhado
| Variável | Descrição |
|---|---|
AUTH_TOKEN_SECRET |
Mesmo valor em auth + microsserviços Java |
ECOSIF_API_TOKEN_MODE |
ECOSIF_JWT |
Exemplo mínimo:
ECOSIF_ENABLE_LOCAL_AUTH=true
ECOSIF_ENABLE_AZURE_AUTH=false
ECOSIF_ENABLE_GOOGLE_AUTH=true
ECOSIF_AUTH_PROVIDER=GOOGLE
ECOSIF_GOOGLE_CLIENT_ID=<oauth-client-id>.apps.googleusercontent.com
ECOSIF_GOOGLE_AUTH_MODE=popup
ECOSIF_GOOGLE_EXPECTED_ISSUER=https://accounts.google.com
ECOSIF_AUTH_AUTO_PROVISION=true
ECOSIF_API_TOKEN_MODE=ECOSIF_JWT
Catálogo completo: variaveis_autenticacao_baseline.md.
5. Deploy e validação
Subir ambiente
cd ecosif-structure
docker compose --env-file .env-dev build ecosif-auth ecosif-angular
docker compose --env-file .env-dev up -d
Checklist pós-deploy
- [ ] Botão Entrar com Google visível (
ECOSIF_ENABLE_GOOGLE_AUTH=true) - [ ] Popup GIS abre sem erro
origin_mismatch - [ ] Rede:
POST /ecosif-auth/api/auth/external-logincomprovider: "GOOGLE"→ 200 - [ ] JWT ECOSIF no
localStorage - [ ] APIs
/ecosif-*respondem com Bearer JWT ECOSIF - [ ] Primeiro login cria usuário (auto-provision)
Validar id_token
Claims esperados no id_token Google:
| Claim | Esperado |
|---|---|
iss |
https://accounts.google.com ou accounts.google.com |
aud |
ECOSIF_GOOGLE_CLIENT_ID |
email |
E-mail do usuário |
exp |
Não expirado |
Teste com curl (token obtido do popup em homolog):
curl -s -X POST "https://{host}/ecosif-auth/api/auth/external-login" \
-H "Content-Type: application/json" \
-d '{"provider":"GOOGLE","token":"<id_token>","tokenType":"ID_TOKEN"}'
6. Problemas comuns
| Sintoma | Causa provável | Correção |
|---|---|---|
origin_mismatch / GIS não carrega |
Origem não autorizada | Adicionar URL exata em Authorized JavaScript origins |
| Botão Google não aparece | ECOSIF_ENABLE_GOOGLE_AUTH=false ou AUTH_PROVIDER ≠ GOOGLE |
Alinhar provider e flags no .env + rebuild Angular |
401 em external-login |
aud inválido ou token expirado |
Conferir ECOSIF_GOOGLE_CLIENT_ID; novo login |
| Conflito Azure + Google | Dois IdPs no mesmo ambiente | MVP1 permite um provedor — desabilitar o outro |
429 em external-login |
Rate limit | Ver ECOSIF_AUTH_EXT_LOGIN_RL_* |
7. Referências
- configuracao_provedores.md — runtime Angular (GIS)
- external-login-api.md
- frontend-external-login-fase3.md
- gateway_jwt_ecosif.md