# 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: ```rust 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: - [x] Modificar la función `is_public_path` para detectar si la ruta tiene extensión de archivo - [x] Si tiene extensión → usar match exacto (comportamiento actual) - [x] Si NO tiene extensión → usar match por prefijo (permitir `/static/*` automáticamente) - [x] 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 - [x] Requests a archivos exactos (con extensión) requieren match completo - [x] Requests a directorios/rutas (sin extensión) permiten todos los subpaths - [x] El código mantiene backward compatibility con configs existentes - [x] La lógica es eficiente (no itera innecesariamente) - [x] Tests unitarios verifican todos los casos de uso ## Potential Risks 1. **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 1. **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 2. **Usar regex**: Permitir expresiones regulares en las rutas públicas - Muy flexible pero potencial security risk si no se sanitiza bien 3. **Mantener ambos modos**: Agregar un flag para elegir entre modo exacto o prefijo - Más complejo pero backwards compatible