Cloud Firestore i Realtime Database opierają się na potężnych, zwięzłych językach reguł stworzonych specjalnie do zarządzania bezpieczeństwem informacji i kontrolą dostępu. Jednak w miarę jak reguły stają się dłuższe i bardziej złożone, możesz potrzebować pomocy w debugowaniu błędów w ich zachowaniu.
Emulatory Firebase obejmują możliwość generowania raportów pokrycia reguł, dzięki czemu można dokładnie zobaczyć, do czego zostało ocenione każde podwyrażenie podczas odtwarzania błędu. Raporty dostarczają również informacji o tym, jak często każdy przypadek testowy używał reguły, podobnie jak tradycyjne techniki „pokrycia linii”.
Wygeneruj raport
Po przeprowadzeniu zestawu testów możesz uzyskać dostęp do raportów pokrycia testów, które pokazują, jak oceniono każdą z reguł bezpieczeństwa.
Aby uzyskać raporty, wyślij zapytanie do uwidocznionego punktu końcowego w emulatorze, gdy jest on uruchomiony. Aby uzyskać wersję przyjazną dla przeglądarki, użyj następującego adresu URL:
Cloud Firestore
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html
Baza danych czasu rzeczywistego
http://localhost:9000/.inspect/coverage?ns=<database_name>
Spowoduje to rozbicie reguł na wyrażenia i wyrażenia podrzędne, na które można najechać kursorem myszy, aby uzyskać więcej informacji, w tym liczbę ocen i zwróconych wartości. Aby uzyskać nieprzetworzoną wersję tych danych w formacie JSON, w zapytaniu uwzględnij następujący adres URL:
Cloud Firestore
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage
Baza danych czasu rzeczywistego
http://localhost:9000/.inspect/coverage.json?ns=<database_name>
Debugowanie przykładowych reguł
Aby łatwo wygenerować raport z testu, skorzystaj z przewodników szybkiego startu dla emulatora dostępnych w GitHub dla Cloud Firestore i Realtime Database . Te przewodniki Szybki Start przeprowadzą Cię przez proces prawidłowego instalowania i inicjowania emulatorów, a następnie generowania przykładowych testów z przykładowego zestawu reguł.
Rozważ przykładową aplikację korzystającą z Cloud Firestore, która zlicza, ile razy użytkownicy kliknęli przycisk. W aplikacji obowiązują następujące zasady:
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 następującego przykładowego testu JavaScript:
const counter0 = db.collection("counters").doc("0");
await firebase.assertSucceeds(counter0.set({value: 0}));
Emulator generuje raport dostępny pod wskazanym powyżej adresem URL:
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html
Raport zawiera następujące niezdefiniowane błędy i błędy o wartości pustej:
Problem z tym konkretnym przykładem polega na tym, że reguły nie rozróżniają tworzenia dokumentu i aktualizowania dokumentu. W związku z tym zapis nie jest dozwolony, jeśli dokument nie istnieje, a dokument nie może zostać utworzony, ponieważ nie istnieje. Rozróżnienie „zapisu” na dwie bardziej szczegółowe operacje — „tworzenie” i „aktualizacja” — rozwiązuje 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 była używana każda reguła i co zostało zwrócone.