Por: Juan Andrés Núñez
Juan Andrés Núñez - juanwmedia

Especialista en tecnologías Web. Me dedico a enseñar desarrollo Web moderno a cualquier persona (físicamente en clase y a través de Internet) desde una perspectiva holística: teniendo en cuenta las competencias técnicas necesarias, junto a las habilidades personales o soft skills. Tienes más información en mi Web.

  • Las reglas de seguridad de Cloud Storage son en esencia las mismas que utiliza Cloud Firestore.
  • Primero debemos (igual que hicimos con Cloud Firestore) cerrar todo al 100% para luego ir abriendo poco a poco y en base a nuestras condiciones.
match /{allPaths=**} {
    allow read, write: if false;
}
  • Ahora vamos a añadir una regla que, a través de un recursive wildcard pueda llegar a todos los paths en nuestro bucket de Cloud Storage y permitir leer unicamente si estás autentificado.
match /rooms/{roomID=**} {
    // Solo puedes leer y escribir si estás autentificado
    allow read: if request.auth != null;
}
  • Para poder escribir, además de estar autentificado lo que se escriba debe ser una imagen o un archivo de audio (y tener un peso determinado) En cuanto a este último si nos fijamos en alguno ya subido verás que no se interpreta como audio sino como "application/octet-stream", por lo que debemos usar metatados apropiados al subirlo.
let ext;
const metadata = {};
if (type === "photo") {
    ext = "jpg";
    metadata.contentType = "image/jpeg";
} else {
    ext = "wav";
    metadata.contentType = "audio/wav";
}
...
return storage.ref(fileName).put(file, metadata);
  • Y ajustamos nuestras reglas de seguridad.
// Solo puedes escribir si estás autentificado, pesa menos de 2MB y se trata de una imagen o archivo de audio
allow write: if request.auth != null
            && request.resource.size < 2 * 1024 * 1024
            && (request.resource.contentType.matches('image/jpeg')
                || request.resource.contentType.matches('audio/wav'))
  • Por último, para borrar archivos debemos comprobar que son del usuario conectado. Hay varias formas de hacerlo y si te estás preguntado si se puede acceder a otros servicios de Firebase (como Cloud Firestore, o Authentication) desde Cloud Storage la respuesta es no. Si esta fuera tu necesidad puedes crear un Custom Claim, algo que queda fuera del espectro de este curso.
match /{file} {
// Solo tú puedes borrar tus archivos
allow delete: if request.auth.uid in file.split('\\-');
}
  • Este es el aspecto final de nuestras reglas de seguridad Cloud Storage.
rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {

    // Todo cerrado
    match /{allPaths=**} {
      allow read, write: if false;
    }

    match /rooms/{roomID=**} {
        // Solo puedes leer y escribir si estás autentificado
        allow read: if request.auth != null;

        // Solo puedes escribir si estás autentificado, pesa menos de 2MB y se trata de una imagen o archivo de audio
        allow write: if request.auth != null
                        && request.resource.size < 2 * 1024 * 1024
                        && (request.resource.contentType.matches('image/jpeg') || request.resource.contentType.matches('audio/wav'))

      match /{file} {
        // Solo tú puedes borrar tus archivos
        allow delete: if request.auth.uid in file.split('\\-');
      }
    }
  }
}

Presentación


Firebase Auth


Cloud Firestore 🔥


Cloud Storage 🗄


Cloud Functions ☁


No te pierdas ninguna novedad

Escuela Vue en Twitter

Participa en la Comunidad Escuela Vue

Comunidad Escuela Vue