Firebase : Almacenamiento de archivos

publicado en la categoría Firebase
Firebase Storage es interesante porque nunca está de más tener un espacio en la nube para poder alojar archivos pero me cuesta trabajo decidir la utilidad de las funciones del API salvo para casos muy particulares porque deben establecerse reglas de acceso muy estrictas a menos que nos guste tener problemas.

Me cuesta trabajo decidir la utilidad práctica del sistema de almacenamiento (Storage) de Firebase. Es evidente que es interesante y nunca está de más tener un espacio en la nube para poder alojar archivos, muchos de los cuales no podríamos tener en otros sitios simplemente porque hay una tendencia mundial a minimizar el acceso gratuito cuando lo que necesitamos es usar esos archivos en nuestras propias páginas web y no tenemos un servidor propio o no queremos sobrecargarlo.

Si queremos usar Firebase Storage para eso, no hay mucho que explicar, basta abrir la consola y usar el botón Subir Archivo, esperar unos segundos y listo.

Una vez que lo tenemos, click en el nombre y allí, desplegando la opción Ubicación del archivo, podremos copiar la dirección url de descarga que es la que podríamos utilizar en cualquier sitio web aunque, a simple vista, es un poco extraña ... pero recuerden que Firebase es Google y ellos se especializan en ese tipo de direcciones exóticas:

https://firebasestorage.googleapis.com/v0/b/proyecto.appspot.com/o/imagen.jpg?alt=media&token=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Lo usemos como lo usemos, así o para algo más sofisticado, debemos tener cuidado y establecer reglas para evitar problemas y eso lo hacemos en la pestaña reglas que, por defecto, establece las autorizaciones de lectura/escritura de todos los archivos sólo para usuarios autenticados:

service firebase.storage {
	match /b/xxxxxx-xxxxx.appspot.com/o {
		match /{allPaths=**} {
			allow read, write: if request.auth != null;
		}
	}
}

Dependiendo de cada caso, esas reglas deben ser modificadas. Por ejemplo, si voy a guardar imágenes que luego usaré en un sitio web y quiero que cualquiera pueda verlas, pondré algo así:

service firebase.storage {
	match /b/xxxxxx-xxxxx.appspot.com/o {
		match /{allPaths=**} {
			allow read;
			allow write: if request.auth.uid == userId;
		}
	}
}

Podría ser más estricto y establecer una regla de acceso público a una carpeta específica o a un archivo en particular, agregando la ruta:

match /imagenes { 
	// todos los archivos de esta carpeta
}
match /images/archivo.jpg {
	// sólo este archivo
}

El API permite manejar el almacenamiento utilizando JavaScript pero, insisto, no creo que esto sea algo demasiado útil, salvo casos particulares donde debería evaluarse muy bien cuáles son las reglas de seguridad a establecer.

De todos modos, aunque no usemos las funciones para subir archivos, podemos utilizar aquellas que nos permiten acceder a ellos mediante JavaScript; algo que es relativamente sencillo aunque excesivamente limitado:

var storageRef = firebase.storage.ref(); // creamos una referencia a la raiz
storageRef.child("nombre_archivo").getDownloadURL().then(function(url){
	alert(url); // url será el path completo del archivo
}).catch(function(error) {
	alert("ERROR");
});

En ese ejemplo, la función child() apunta a la raíz pero podría usarse cualquier path interno.