Reglas de Seguridad en Firebase Storage para Blogs

Clase 24 de 32Curso de Firebase 5 para Web

Resumen

Asegura tu flujo de imágenes en Firebase con reglas claras y efectivas. Aquí verás cómo abrir lectura pública por ruta específica y restringir la escritura a usuarios autenticados, validando tamaño del archivo y tipo de contenido. El resultado: imágenes visibles para todos y subidas controladas solo por su dueño, con archivos válidos y ligeros.

¿Qué problema resuelven las reglas de Firebase Storage?

Las reglas por defecto de Firebase permiten escribir solo si estás autenticado, pero no contemplan rutas específicas ni validaciones finas. Para un blog con imágenes en storage, se ajustan estas reglas para que:

  • Cualquier usuario pueda leer imágenes públicas sin autenticarse.
  • Solo el propietario pueda subir archivos a su directorio.
  • Se valide el tamaño: menor a 5 MB.
  • Se verifique el tipo de archivo: solo imágenes.

¿Qué conceptos clave se aplican?

  • Autenticación, autorización y validación de datos: seguridad integral en storage.
  • Patrón de rutas con match: define reglas por directorios y subdirectorios.
  • Variables de ruta como {userID} y {IMG ID}: capturan valores dinámicos.
  • Identidad del usuario con request.auth.uid: asegura escritura solo en su carpeta.
  • Tipos MIME con content type y matches: restringen a image/.*.

¿Qué estructura de carpetas se usa?

  • Directorio raíz de imágenes: “IMGs post/”.
  • Subcarpeta por usuario: “IMGs post/{userID}/”.
  • Archivo dentro: “IMGs post/{userID}/{IMG ID}”.

¿Cómo configurar lectura pública y escritura segura?

Se parte del tab de reglas en la consola. Se ajusta el match global a rutas concretas y se añaden condiciones para validar archivo, usuario y tipo de contenido.

¿Cómo abrir lectura pública por ruta específica?

  • Aplicar un match a “IMGs post/**” para permitir read sin autenticación.
  • Mantener write con restricciones en una regla más específica.
rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    // Lectura pública de todas las imágenes bajo "IMGs post/"
    match /IMGs post/{allPaths=**} {
      allow read: if true;
    }

    // Escritura segura por usuario y archivo específico
    match /IMGs post/{userID}/{imgID} {
      allow read: if true;
      allow write: if request.auth != null
                   && request.auth.uid == userID
                   && request.resource.size < 5 * 1024 * 1024
                   && resource.contentType.matches('image/.*');
    }
  }
}

¿Cómo limitar el tamaño a 5 MB?

  • Usar una condición que compare el tamaño del archivo subido con 5 × 1024 × 1024.
  • Beneficio: evita archivos pesados que afecten rendimiento y costos.

Puntos clave: - Solo se aceptan archivos < 5 MB. - La validación ocurre en el servidor de Firebase.

¿Cómo validar tipo de archivo e identidad del usuario?

  • Tipo de contenido: usar resource.contentType.matches('image/.*').
  • Identidad: exigir request.auth != null y request.auth.uid == userID.

Esto garantiza que: - Solo imágenes válidas se suban. - Cada usuario escribe en “su” directorio y no en el de otros.

¿Qué errores comunes y reto final se proponen?

Al probar la subida, puede fallar si no hay sesión iniciada: “no puede leer la propiedad UID en el post controller”. La causa es clara: no hay autenticación, por lo que no existe UID en el cliente.

¿Cómo resolver el error de autenticación?

  • Iniciar sesión, por ejemplo con Google.
  • Opcional: validar antes de abrir la ventana de post para evitar intentos de subida sin sesión.

Efecto al autenticarse: - La subida cumple reglas: usuario autenticado, carpeta propia, imagen válida y menos de 5 MB. - El post se crea con imagen y link del video visibles.

¿Qué reto práctico queda pendiente?

  • Habilitar en el formulario de comentarios la subida de un archivo máximo de 1 MB.
  • Permitir la subida solo si el usuario está autenticado.

Sugerencias de implementación: - Reutilizar el patrón de match con carpeta específica para comentarios. - Replicar validación de tamaño y autenticación.

¿Tienes dudas o quieres compartir cómo estructuraste tus reglas? Deja tu comentario y cuéntanos qué validaciones añadiste. Próximamente: hosting de Firebase.