76 lines
3.0 KiB
Markdown
76 lines
3.0 KiB
Markdown
# 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 |