- Added Better Auth integration to the web application, allowing for dual login support with both custom and Better Auth systems. - Updated authentication client configuration to dynamically set the base URL based on the environment. - Enhanced chat components to utilize user authentication status, improving user experience and security. - Refactored various components to support Better Auth, including error handling and user identity management. - Improved notification handling and user feedback mechanisms during authentication processes.
6.5 KiB
6.5 KiB
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
localStorageno frontend - Uso de
ConvexHttpClient.setAuth(token)para autenticar requisições
- Login via
- ⚠️ Problema encontrado: Vulnerabilidade onde mensagens eram enviadas em nome errado
- ❌ Estado após correção: Agora falha porque
ctx.auth.getUserIdentity()retornanull(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.tsnão tem integração - ❌ Integração: Código comentado no
+layout.svelte
🔍 Por que está falhando agora?
Após remover o fallback inseguro:
// 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
- Segurança: Elimina vulnerabilidades de identificação incorreta
- Confiabilidade: Biblioteca testada e mantida pela comunidade
- Features: OAuth, 2FA, recuperação de senha, etc
- Padrão: Usa
ctx.auth.getUserIdentity()nativo do Convex - Futuro: Mais fácil adicionar novos métodos de auth
⚠️ Desvantagens/Custos
- Trabalho inicial: Configurar Better Auth no Convex
- Migração de dados: Migrar sessões ativas
- Mudanças no frontend: Alterar fluxo de login
- Breaking changes: Usuários precisarão fazer login novamente
- Tempo: 2-4 horas de trabalho
📝 Arquivos que precisam mudar
Backend:
packages/backend/convex/convex.config.ts- Adicionar Better Auth providerpackages/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 Authapps/web/src/lib/components/Sidebar.svelte- Migrar login para Better Authapps/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:
- ✅ Mais seguro (resolve o problema atual)
- ✅ Padrão da indústria
- ✅ Menos código para manter
- ✅ Melhor integração com Convex
- ⚠️ 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:
- Configurar Custom Auth Provider no
convex.config.tspara ler token do header - Modificar
getUsuarioAutenticadopara buscar sessão pelo token específico - 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:
// 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