Cloud Firestore y Realtime Database se basan en lenguajes de reglas potentes y concisas, creados específicamente para controlar la seguridad de la información y el control de acceso. Sin embargo, a medida que las reglas se hacen más largas y complejas, es posible que necesites ayuda para depurar los errores en su comportamiento.
Los emuladores de Firebase incluyen la capacidad de generar informes de cobertura de reglas, por lo que puedes ver exactamente qué evaluó cada subexpresión cuando reproduces un error. Los informes también proporcionan información sobre la frecuencia con la que cada caso de prueba usó una regla, como las técnicas tradicionales de “cobertura de línea”.
Genera un informe
Luego de ejecutar un conjunto de pruebas, puedes acceder a los informes de cobertura de pruebas que muestran cómo se evaluaron las reglas de seguridad.
Para obtenerlos, consulta un extremo expuesto en el emulador mientras se ejecuta. Usa la siguiente URL para una versión compatible con el navegador:
Cloud Firestore
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html
Realtime Database
http://localhost:9000/.inspect/coverage?ns=<database_name>
Esto divide tus reglas en expresiones y subexpresiones sobre las que puedes desplazar el mouse para obtener más información, como la cantidad de evaluaciones y los valores mostrados. Si quieres acceder a la versión JSON sin procesar de los datos, incluye la siguiente URL en la consulta:
Cloud Firestore
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage
Realtime Database
http://localhost:9000/.inspect/coverage.json?ns=<database_name>
Cómo depurar ejemplos de reglas
Si deseas generar fácilmente un informe de prueba, usa los inicios rápidos del emulador, disponibles en GitHub para Cloud Firestore y Realtime Database. Estos inicios rápidos te guiarán a través de la instalación y la inicialización adecuada de los emuladores y, a continuación, generarán pruebas de muestra a partir de un conjunto de reglas de ejemplo.
Considera una app de ejemplo que usa Cloud Firestore, que cuenta cuántas veces los usuarios hacen clic en un botón. La app emplea las siguientes reglas:
Cloud Firestore
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, usa la siguiente prueba de muestra de JavaScript:
const counter0 = db.collection("counters").doc("0");
await firebase.assertSucceeds(counter0.set({value: 0}));
El emulador genera un informe disponible en la URL mencionada 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 distinguen entre crear el documento o actualizarlo. En consecuencia, la escritura no está permitida si el documento no existe y el documento no se puede crear porque no existe. El problema se soluciona con la diferenciación de la “escritura” en dos operaciones más específicas: “crear” y “actualizar”.
Cloud Firestore
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 la frecuencia con la que se usó cada regla y lo que se mostró.