Cloud Firestore y Realtime Database se basan en lenguajes de reglas potentes y concisos creados específicamente para regular la seguridad de la información y el control de acceso. Sin embargo, a medida que las reglas se vuelven más largas y complejas, es posible que necesite ayuda para depurar errores en su comportamiento.
Los emuladores de Firebase incluyen la capacidad de generar informes de cobertura de reglas, para que pueda ver exactamente cómo se evaluó cada subexpresión cuando reproduce un error. Los informes también proporcionan información sobre la frecuencia con la que cada caso de prueba utilizó una regla, como las técnicas tradicionales de "cobertura de línea".
Generar un informe
Después de ejecutar un conjunto de pruebas, puede acceder a informes de cobertura de pruebas que muestran cómo se evaluó cada una de sus reglas de seguridad.
Para obtener los informes, consulte un punto final expuesto en el emulador mientras se está ejecutando. Para obtener una versión compatible con el navegador, utilice la siguiente URL:
Tienda de fuego en la nube
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html
Base de datos en tiempo real
http://localhost:9000/.inspect/coverage?ns=<database_name>
Esto divide sus reglas en expresiones y subexpresiones sobre las que puede pasar el mouse para obtener más información, incluida la cantidad de evaluaciones y valores devueltos. Para la versión JSON sin formato de estos datos, incluya la siguiente URL en su consulta:
Tienda de fuego en la nube
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage
Base de datos en tiempo real
http://localhost:9000/.inspect/coverage.json?ns=<database_name>
Reglas de ejemplo de depuración
Para generar fácilmente un informe de prueba, utilice los inicios rápidos del emulador disponibles en GitHub para Cloud Firestore y Realtime Database . Estos inicios rápidos lo guiarán a través de la instalación e inicialización adecuada de los emuladores y luego generarán pruebas de muestra a partir de un conjunto de reglas de ejemplo.
Considere una aplicación de ejemplo que usa Cloud Firestore y que cuenta cuántas veces los usuarios hacen clic en un botón. La aplicación emplea las siguientes reglas:
Tienda de fuego en la nube
service cloud.firestore { match /databases/{database}/documents { match /counters/{counter} { allow read; allow write: if request.resource.data.value == resource.data.value +1; } } }
Para depurar los errores en las reglas que se muestran arriba, utilice la siguiente prueba de JavaScript de ejemplo:
const counter0 = db.collection("counters").doc("0");
await firebase.assertSucceeds(counter0.set({value: 0}));
El emulador genera un informe disponible en la URL indicada anteriormente:
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html
El informe muestra los siguientes errores indefinidos y de valor nulo:
El problema con este ejemplo específico es que las reglas no diferencian entre crear el documento y actualizarlo. En consecuencia, no se permite la escritura si el documento no existe y el documento no se puede crear porque no existe. Diferenciar la "escritura" en dos operaciones más específicas ( "crear" y "actualizar") resuelve el problema.
Tienda de fuego en la nube
service cloud.firestore { match /databases/{database}/documents { match /counters/{counter} { allow read; allow create: if request.resource.data.value == 0; allow update: if request.resource.data.value == resource.data.value +1; } } }
El informe generado muestra con qué frecuencia se utilizó cada regla y qué se devolvió.