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 obtener una versión compatible con navegadores:
http://localhost:8080/emulator/v1/projects/<database_name> :ruleCoverage.html
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:
http://localhost:8080/emulator/v1/projects/<database_name> :ruleCoverage
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 las guías de inicio rápido 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 y que cuenta cuántas veces los usuarios hacen clic en un botón. La app emplea las siguientes reglas:
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”.
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ó.