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

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