3.0 KiB
3.0 KiB
Plan: Mejora de Public Routes en JWT Middleware
Objective
Modificar la lógica de verificación de rutas públicas en el JWT middleware para que:
- Si el path tiene extensión de archivo → hacer match exacto del archivo
- Si el path NO tiene extensión → hacer match por prefijo (permitir todo bajo esa ruta)
Implementation Plan
Análisis del código actual
El código en src/middleware/jwt.rs:56 hace:
let is_public_path = self.public_routes.contains(&req.uri().path().to_string());
Esto hace un match exacto, lo cual es limitante.
Modificaciones requeridas
Modificaciones requeridas:
- Modificar la función
is_public_pathpara detectar si la ruta tiene extensión de archivo - Si tiene extensión → usar match exacto (comportamiento actual)
- Si NO tiene extensión → usar match por prefijo (permitir
/static/*automáticamente) - Agregar helper function para detectar extensiones de archivo comunes
Lógica de verificación propuesta
Para cada public_route en public_routes:
1. Obtener el path de la request
2. Si public_route tiene extensión de archivo:
- Comparar exactamente (path == public_route)
3. Si public_route NO tiene extensión:
- Comparar si path EMPIEZA con public_route + "/"
Ejemplos de comportamiento
| public_route | request_path | resultado |
|---|---|---|
/static/logo.png |
/static/logo.png |
✓ público |
/static/logo.png |
/static/other.png |
✗ requiere auth |
/static |
/static/file.js |
✓ público |
/static |
/static/css/style.css |
✓ público |
/static |
/static |
✓ público |
/api |
/api/users |
✓ público |
Extensiones válidas a considerar
Extensions comunes: .html, .js, .css, .json, .png, .jpg, .jpeg, .gif, .svg, .ico, .woff, .woff2, .ttf, .eot, .txt, .xml, .csv, .webp
Verification Criteria
- Requests a archivos exactos (con extensión) requieren match completo
- Requests a directorios/rutas (sin extensión) permiten todos los subpaths
- El código mantiene backward compatibility con configs existentes
- La lógica es eficiente (no itera innecesariamente)
- Tests unitarios verifican todos los casos de uso
Potential Risks
- Breaking change: Si alguien configuró
public_routes: ["/static/file.js"]esperando que también permita otros archivos, ahora solo permitirá ese archivo específico- Mitigation: Documentar el cambio y notificar a los usuarios
Alternative Approaches
-
Usar glob patterns: Aceptar patrones como
/static/**explícitamente- Más flexible pero más complejo de implementar
- Requiere cambiar el formato de configuración
-
Usar regex: Permitir expresiones regulares en las rutas públicas
- Muy flexible pero potencial security risk si no se sanitiza bien
-
Mantener ambos modos: Agregar un flag para elegir entre modo exacto o prefijo
- Más complejo pero backwards compatible