- 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.
180 lines
6.5 KiB
Markdown
180 lines
6.5 KiB
Markdown
# 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
|
|
|