Files
servme/plans/2026-04-29-public-routes-enhancement-v1.md
T

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_path para 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

  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