Files
sgse-app/ANALISE_AUTENTICACAO.md
deyvisonwanderley 06f03b53e5 feat: integrate Better Auth and enhance authentication flow
- 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.
2025-11-06 09:35:36 -03:00

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 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:

// 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:

// 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