Dashboard-Automatizase/docs/COMO-TESTAR-GOOGLE-OAUTH.md
Luis 1391fe6216 feat: enhance Google Calendar integration and update Dockerfile for environment variables
- Updated Dockerfile to include hardcoded environment variables for Next.js build.
- Enhanced Google Calendar API integration by extracting user email from id_token and adding scopes for OpenID and email access.
- Modified credential management to delete existing credentials before creating new ones in n8n.
- Updated dashboard to display connected Google Calendar email and credential details.

Story: 4.2 - Melhorar integração com Google Calendar e atualizar Dockerfile

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2025-10-12 21:16:21 -03:00

8.1 KiB

Como Testar o Fluxo Google OAuth Completo

Alterações Implementadas

1. Scopes Corrigidos

  • Adicionado calendar.readonly aos scopes
  • Scopes completos: gmail.modify, calendar.readonly, calendar.events

2. Banco de Dados Supabase

  • Campo n8n_credential_id já existe
  • Novo campo n8n_credential_name para armazenar "refugio"

3. Frontend

  • Exibição do nome da credencial (sempre "refugio")
  • Exibição do ID da credencial
  • Exibição do email conectado

🔧 Passo 1: Executar Migration no Supabase

Opção A: Via SQL Editor do Supabase (Recomendado)

  1. Acesse o Supabase:

    https://supabase.automatizase.com.br
    
  2. Vá para SQL Editor:

    • Menu lateral → SQL Editor
    • Clique em "New query"
  3. Execute a Migration:

    Copie e cole este SQL:

    -- Migration: Adicionar coluna n8n_credential_name na tabela integrations
    -- Story: 3.4 - Gerenciar Credenciais Google OAuth via API do n8n
    -- Data: 2025-10-12
    
    -- Adicionar coluna para armazenar nome da credencial no n8n
    ALTER TABLE portal.integrations
    ADD COLUMN IF NOT EXISTS n8n_credential_name VARCHAR(100) DEFAULT 'refugio';
    
    -- Comentário para documentação
    COMMENT ON COLUMN portal.integrations.n8n_credential_name IS 'Nome da credencial Google OAuth2 no n8n (sempre "refugio" para não quebrar workflows)';
    
    -- Atualizar registros existentes (se houver) para garantir que tenham o nome "refugio"
    UPDATE portal.integrations
    SET n8n_credential_name = 'refugio'
    WHERE provider = 'google_calendar' AND n8n_credential_name IS NULL;
    
    -- Verificar resultado
    SELECT * FROM portal.integrations WHERE provider = 'google_calendar';
    
  4. Clique em "Run" (ou pressione Ctrl+Enter)

  5. Verifique o resultado:

    • Deve mostrar "Success" ou retornar as linhas da tabela

🧪 Passo 2: Testar o Fluxo OAuth

1. Reiniciar Servidor (Se Ainda Não Reiniciou)

# Pressione Ctrl+C no terminal onde npm run dev está rodando
npm run dev

2. Acessar Dashboard

http://localhost:3000/dashboard

3. Clicar em "Conectar Google Calendar"

O que deve acontecer:

  1. Você será redirecionado para a tela de consentimento do Google
  2. Google solicitará permissões para:
    • Ver seus calendários (calendar.readonly)
    • Gerenciar eventos de calendário (calendar.events)
    • Ler, escrever e enviar emails (gmail.modify)

4. Autorizar as Permissões

Importante: Selecione todas as permissões solicitadas.

5. Verificar Redirect

Após autorização, você será redirecionado para:

http://localhost:3000/dashboard?oauth_success=true

6. Verificar Dashboard

No card "Google Calendar", você deve ver:

Google Calendar                         Conectado ✅

📧 Conectado como: seu-email@gmail.com
🔑 Credencial n8n: refugio
ID: xyz123abc (ID da credencial no n8n)

[Reconectar]

🔍 Passo 3: Verificar n8n

1. Acessar n8n

https://n8n.automatizase.com.br

2. Ir para Credentials

Menu lateral → Credentials

3. Procurar credencial "refugio"

Você deve ver:

  • Nome: refugio
  • Tipo: Google Calendar OAuth2 API
  • Status: Conectado (com ícone verde)

4. Abrir a Credencial

Clique na credencial "refugio" e verifique:

  • Client ID está preenchido
  • Client Secret está preenchido
  • Token está ativo (se você testar a conexão)

🗄️ Passo 4: Verificar Supabase

1. Acessar Table Editor

https://supabase.automatizase.com.br

Menu lateral → Table Editor → Schema: portal → integrations

2. Verificar Registro

Deve existir uma linha com:

  • user_id: Seu UUID de usuário
  • provider: google_calendar
  • status: connected
  • n8n_credential_id: ID da credencial no n8n
  • n8n_credential_name: refugio
  • connected_at: Data/hora da conexão

Checklist de Validação

Marque cada item após verificar:

Frontend:
  - [ ] Dashboard carrega sem erros
  - [ ] Card do Google Calendar exibe status "Conectado ✅"
  - [ ] Email é exibido corretamente
  - [ ] Nome da credencial "refugio" é exibido
  - [ ] ID da credencial é exibido

Backend:
  - [ ] Endpoint /api/google-calendar/auth retorna oauth_url
  - [ ] Endpoint /api/google-calendar/callback processa tokens
  - [ ] Endpoint /api/google-calendar/manage-credential cria credencial

n8n:
  - [ ] Credencial "refugio" existe
  - [ ] Credencial tem scopes corretos
  - [ ] Workflow "Create an event in Google Calendar" funciona
  - [ ] Erro "403 - Forbidden" não aparece mais

Supabase:
  - [ ] Coluna n8n_credential_name existe
  - [ ] Registro em portal.integrations está correto
  - [ ] Status = "connected"
  - [ ] connected_at tem data/hora válida

🐛 Troubleshooting

Erro: "Request had insufficient authentication scopes"

Causa: Tokens antigos sem o scope calendar.readonly

Solução:

  1. No dashboard, clique em "Reconectar"
  2. Autorize novamente no Google
  3. A nova credencial terá todos os scopes necessários

Erro: "column n8n_credential_name does not exist"

Causa: Migration não foi executada

Solução:

  1. Execute a migration SQL no Supabase (Passo 1)
  2. Reinicie o servidor Next.js
  3. Teste novamente

Credencial não aparece no n8n

Causa: Variáveis de ambiente incorretas

Solução:

  1. Verifique .env.local:
    N8N_API_URL=https://n8n.automatizase.com.br/api/v1
    N8N_API_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
    NEXT_PUBLIC_GOOGLE_CLIENT_ID=174466774807-xxx.apps.googleusercontent.com
    GOOGLE_CLIENT_SECRET=GOCSPX-xxx
    
  2. Reinicie o servidor
  3. Tente conectar novamente

Workflow do n8n não funciona

Causa: Nome da credencial diferente de "refugio"

Solução:

  • O código sempre cria a credencial com nome "refugio"
  • Verifique no n8n se a credencial tem o nome correto
  • Workflows do n8n devem usar a credencial "refugio"

📊 Logs para Monitorar

No Terminal (npm run dev)

# Sucesso esperado:
[auth] OAuth URL gerada para user: uuid-do-usuario
[callback] User: uuid-do-usuario - State validated
[callback] Tokens obtidos do Google
[manage-credential] POST - User: uuid-do-usuario
[n8n-api] Deleting existing credential: old-cred-id (se existir)
[n8n-api] Credential deleted: old-cred-id
[n8n-api] Creating new credential "refugio"
[n8n-api] Credential created successfully: new-cred-id
[n8n-api] IMPORTANTE: Atualize N8N_GOOGLE_CREDENTIAL_ID no .env.local para: new-cred-id
[manage-credential] Credential upserted in n8n: new-cred-id
[manage-credential] Integration status saved to Supabase

No Console do Navegador

// Verificar query params após redirect
console.log(window.location.search)
// Deve mostrar: ?oauth_success=true

🎯 Resultado Final Esperado

Após completar todos os passos:

  1. Dashboard: Mostra credencial "refugio" conectada
  2. n8n: Credencial "refugio" ativa com tokens válidos
  3. Supabase: Registro com credential_id e credential_name
  4. Workflows n8n: Funcionam sem erro de scopes

📚 Arquivos Relacionados

  • SQL Migration: docs/sql/03-add-credential-name.sql
  • Frontend: components/GoogleCalendarCard.tsx
  • Backend: app/api/google-calendar/manage-credential/route.ts
  • API n8n: lib/n8n-api.ts
  • Dashboard: app/dashboard/page.tsx

🚀 Próximos Passos (Opcional)

Melhorias Futuras

  1. Armazenar Google Email no Supabase:

    • Adicionar coluna connected_email em portal.integrations
    • Buscar email via https://www.googleapis.com/oauth2/v1/userinfo
  2. Atualizar N8N_GOOGLE_CREDENTIAL_ID Automaticamente:

    • Ler credential_id do Supabase em vez do .env.local
    • Atualizar .env.local automaticamente via script
  3. Monitoramento de Token:

    • Verificar expiração do token periodicamente
    • Notificar usuário quando token expirar
    • Renovar token automaticamente com refresh_token
  4. Auditoria:

    • Log de todas as operações CRUD de credenciais
    • Histórico de conexões/desconexões

Data: 2025-10-12 Versão: 1.0.0 Status: Pronto para Teste