Zarówno Cloud Firestore, jak i Realtime Database opierają się na zaawansowanych, zwięzłych regułach, które zostały opracowane specjalnie w celu zarządzania bezpieczeństwem informacji i kontrolą dostępu. Jednak z rośnącą złożonością reguł możesz potrzebować pomocy w rozwiązywaniu błędów związanych z ich działaniem.
Emulatory Firebase umożliwiają generowanie raportów o zasięgu reguł, dzięki czemu możesz dokładnie zobaczyć, co oceniło każde wyrażenie podrzędne podczas odtwarzania błędu. Raporty zawierają również informacje o tym, jak często w poszczególnych przypadkach testowych używana jest reguła, np. tradycyjne techniki „zasięgu linii”.
Generowanie raportu
Po uruchomieniu zestawu testów możesz uzyskać dostęp do raportów o zakresie testów, które pokazują, jak oceniono każdą z reguł bezpieczeństwa.
Aby uzyskać raporty, prześlij zapytanie do punktu końcowego w emulatorze, gdy jest on uruchomiony. Aby wyświetlić wersję przyjazną przeglądarce, użyj tego adresu URL:
Cloud Firestore
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html
Realtime Database
http://localhost:9000/.inspect/coverage?ns=<database_name>
Dzięki temu reguły są dzielone na wyrażenia i podwyrażenia, nad którymi możesz najechać kursorem, aby uzyskać więcej informacji, w tym liczbę zwracanych ocen i wartości. Aby uzyskać wersję tych danych w postaci surowych danych w formacie JSON, dodaj do zapytania ten adres URL:
Cloud Firestore
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage
Realtime Database
http://localhost:9000/.inspect/coverage.json?ns=<database_name>
Debugowanie przykładowych reguł
Aby łatwo wygenerować raport testowy, użyj quickstartów emulatora dostępnych na GitHubie dla Cloud Firestore i Realtime Database. Te krótkie przewodniki zawierają instrukcje prawidłowego instalowania i inicjowania emulatorów, a następnie generowania przykładowych testów na podstawie przykładowego zbioru reguł.
Rozważ przykładową aplikację korzystającą z elementu Cloud Firestore, który zlicza, ile razy użytkownicy kliknęli przycisk. Aplikacja stosuje te reguły:
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; } } }
Aby debugować błędy w regułach pokazanych powyżej, użyj tego przykładowego testu JavaScript:
const counter0 = db.collection("counters").doc("0");
await firebase.assertSucceeds(counter0.set({value: 0}));
Emulator wygeneruje raport dostępny pod adresem URL podanym powyżej:
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html
Raport zawiera te błędy nieokreślonych i pustych wartości:
Problem z tym przykładem polega na tym, że reguły nie rozróżniają tworzenia i aktualizowania dokumentu. W związku z tym operacja zapisu nie jest dozwolona, jeśli dokument nie istnieje, a dokumentu nie można utworzyć, ponieważ nie istnieje. Rozróżnienie operacji „write” na 2 bardziej szczegółowe operacje – „create” i „update” – rozwiązuje ten problem.
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; } } }
Wygenerowany raport pokazuje, jak często używano poszczególnych reguł i co zwracały.