- 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)
8.1 KiB
Como Testar o Fluxo Google OAuth Completo
✅ Alterações Implementadas
1. Scopes Corrigidos
- ✅ Adicionado
calendar.readonlyaos scopes - ✅ Scopes completos:
gmail.modify,calendar.readonly,calendar.events
2. Banco de Dados Supabase
- ✅ Campo
n8n_credential_idjá existe - ✅ Novo campo
n8n_credential_namepara 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)
-
Acesse o Supabase:
https://supabase.automatizase.com.br -
Vá para SQL Editor:
- Menu lateral → SQL Editor
- Clique em "New query"
-
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'; -
Clique em "Run" (ou pressione Ctrl+Enter)
-
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:
- Você será redirecionado para a tela de consentimento do Google
- 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:
- No dashboard, clique em "Reconectar"
- Autorize novamente no Google
- 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:
- Execute a migration SQL no Supabase (Passo 1)
- Reinicie o servidor Next.js
- Teste novamente
Credencial não aparece no n8n
Causa: Variáveis de ambiente incorretas
Solução:
- 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 - Reinicie o servidor
- 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:
- ✅ Dashboard: Mostra credencial "refugio" conectada
- ✅ n8n: Credencial "refugio" ativa com tokens válidos
- ✅ Supabase: Registro com credential_id e credential_name
- ✅ 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
-
Armazenar Google Email no Supabase:
- Adicionar coluna
connected_emailemportal.integrations - Buscar email via
https://www.googleapis.com/oauth2/v1/userinfo
- Adicionar coluna
-
Atualizar N8N_GOOGLE_CREDENTIAL_ID Automaticamente:
- Ler credential_id do Supabase em vez do
.env.local - Atualizar
.env.localautomaticamente via script
- Ler credential_id do Supabase em vez do
-
Monitoramento de Token:
- Verificar expiração do token periodicamente
- Notificar usuário quando token expirar
- Renovar token automaticamente com refresh_token
-
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