# Análise: Migração para Better Auth ## 📊 Situação Atual ### Sistema Customizado (Atual) - ✅ **Funciona**: Sistema próprio com tokens na tabela `sessoes` - ✅ **Características**: - Login via `api.autenticacao.login` (mutation customizada) - Tokens gerados manualmente - Armazenamento em `localStorage` no frontend - Uso de `ConvexHttpClient.setAuth(token)` para autenticar requisições - ⚠️ **Problema encontrado**: Vulnerabilidade onde mensagens eram enviadas em nome errado - ❌ **Estado após correção**: Agora falha porque `ctx.auth.getUserIdentity()` retorna `null` (Better Auth não configurado) ### Better Auth (Parcialmente Configurado) - ✅ **Frontend**: Cliente criado em `lib/auth.ts` - ✅ **API Route**: Handler em `/api/auth/[...all]/+server.ts` - ❌ **Backend Convex**: **NÃO CONFIGURADO** - `convex.config.ts` não tem integração - ❌ **Integração**: Código comentado no `+layout.svelte` ## 🔍 Por que está falhando agora? Após remover o fallback inseguro: ```typescript // Antes (inseguro, mas funcionava): if (!usuarioAtual) { sessaoAtiva = sessaoMaisRecente(); // ❌ Pegava qualquer usuário } // Agora (seguro, mas não funciona): // Só usa Better Auth, que não está configurado // Resultado: ctx.auth.getUserIdentity() retorna null ``` O código está tentando usar `ctx.auth.getUserIdentity()` do Convex, mas isso **só funciona** se Better Auth estiver integrado ao Convex via `convex.config.ts`. ## 📈 Comparação: Sistema Customizado vs Better Auth | Aspecto | Sistema Customizado | Better Auth | |---------|-------------------|-------------| | **Segurança** | ⚠️ Média (token manual, vulnerável a problemas) | ✅ Alta (padrão da indústria) | | **Manutenção** | ⚠️ Alta (manter código próprio) | ✅ Baixa (biblioteca mantida) | | **Funcionalidades** | ⚠️ Básicas | ✅ Completas (OAuth, 2FA, etc) | | **Confiabilidade** | ⚠️ Dependente da implementação | ✅ Testado e confiável | | **Migração** | - | ⚠️ Trabalhosa (mas única vez) | | **Tempo** | ✅ Já funciona | ⚠️ Requer configuração | ## 🎯 Impacto da Migração para Better Auth ### ✅ Vantagens 1. **Segurança**: Elimina vulnerabilidades de identificação incorreta 2. **Confiabilidade**: Biblioteca testada e mantida pela comunidade 3. **Features**: OAuth, 2FA, recuperação de senha, etc 4. **Padrão**: Usa `ctx.auth.getUserIdentity()` nativo do Convex 5. **Futuro**: Mais fácil adicionar novos métodos de auth ### ⚠️ Desvantagens/Custos 1. **Trabalho inicial**: Configurar Better Auth no Convex 2. **Migração de dados**: Migrar sessões ativas 3. **Mudanças no frontend**: Alterar fluxo de login 4. **Breaking changes**: Usuários precisarão fazer login novamente 5. **Tempo**: 2-4 horas de trabalho ### 📝 Arquivos que precisam mudar **Backend:** - `packages/backend/convex/convex.config.ts` - Adicionar Better Auth provider - `packages/backend/convex/autenticacao.ts` - Manter para features específicas (logs, etc) - `packages/backend/convex/chat.ts` - Já usa Better Auth (precisa configurar) - `packages/backend/convex/usuarios.ts` - Já usa Better Auth (precisa configurar) **Frontend:** - `apps/web/src/routes/+layout.svelte` - Descomentar integração Better Auth - `apps/web/src/lib/components/Sidebar.svelte` - Migrar login para Better Auth - `apps/web/src/lib/stores/auth.svelte.ts` - Adaptar para Better Auth - Qualquer lugar que use `convex.setAuth(token)` ## 🚀 Recomendação **SIM, migrar para Better Auth é melhor**, porque: 1. ✅ Mais seguro (resolve o problema atual) 2. ✅ Padrão da indústria 3. ✅ Menos código para manter 4. ✅ Melhor integração com Convex 5. ⚠️ Custo inicial é aceitável (única vez) ## 📋 Plano de Migração (se aprovar) ### Fase 1: Configurar Better Auth no Convex - Configurar provider no `convex.config.ts` - Testar `ctx.auth.getUserIdentity()` funcionando ### Fase 2: Migrar Login no Frontend - Usar Better Auth para login/logout - Manter sistema customizado como fallback temporário ### Fase 3: Migrar Todas as Queries/Mutations - Garantir que todas usam Better Auth - Remover dependências de tokens customizados ### Fase 4: Limpeza - Remover código de sessões customizadas (ou manter apenas para logs) - Atualizar documentação ## ⚠️ Alternativa: Corrigir Sistema Customizado Se preferir manter o sistema customizado, precisamos: 1. Configurar Custom Auth Provider no `convex.config.ts` para ler token do header 2. Modificar `getUsuarioAutenticado` para buscar sessão pelo token específico 3. Garantir que tokens customizados sejam validados corretamente **Desvantagem**: Continua mantendo código customizado que pode ter bugs futuros. ## 🔧 Solução Imediata: Configurar Custom Auth Provider Para fazer o sistema customizado funcionar AGORA, precisamos configurar um auth provider no Convex: ```typescript // convex.config.ts import { defineApp } from "convex/server"; import { createCustomAuth } from "convex/server"; const app = defineApp({ auth: createCustomAuth({ // Função que extrai o token do header da requisição getToken: async (request) => { const authHeader = request.headers.get("authorization"); if (authHeader?.startsWith("Bearer ")) { return authHeader.substring(7); } return null; }, // Função que valida o token e retorna identity getIdentity: async (token, ctx) => { // Buscar sessão pelo token const sessao = await ctx.db .query("sessoes") .withIndex("by_token", (q) => q.eq("token", token)) .filter((q) => q.eq(q.field("ativo"), true)) .first(); if (!sessao || sessao.expiraEm < Date.now()) { return null; // Token inválido ou expirado } const usuario = await ctx.db.get(sessao.usuarioId); if (!usuario || !usuario.ativo) { return null; } // Retornar identity compatível com Better Auth return { subject: usuario._id, email: usuario.email, emailVerified: true, }; }, }), }); export default app; ``` Depois disso, `ctx.auth.getUserIdentity()` funcionará com tokens customizados! ## 💡 Minha Recomendação Final **Opção A - Migrar para Better Auth (RECOMENDADO)**: - ✅ Mais seguro e confiável - ✅ Padrão da indústria - ⚠️ 2-4 horas de trabalho - ✅ Solução definitiva **Opção B - Configurar Custom Auth Provider (RÁPIDO)**: - ✅ Funciona imediatamente - ✅ Mantém sistema atual - ⚠️ Continua código customizado - ⚠️ Mais manutenção futura