Firestore のセキュリティルールは、テストを書きながら emurator で実行して問題ないかをチェックする、というのが一般的な方法。
ただ、いろいろなチュートリアルや書籍を見ていてもプリントデバッグができる debug()
関数が載っていなかった(エミュレータのみだからなのか、当たり前すぎるのか、みんな知らずに書いているのか…)ので書いておく。
-
https://firebase.google.com/docs/reference/rules/rules.debug
- (というか、この debug も含めた、セキュリティルールの関数や型全般の仕様が理解できる「セキュティルールのAPIリファレンス」にたどり着くのが困難…)
の通り、使い方は単純で debug()
は引数の値を firestore-debug.log に出力し、引数自体を返す関数。
例えば、
match /users/{userId} {
allow read, update, delete: if
request.auth.uid == userId;
は、debug()
を使うと
match /users/{userId} {
allow read, update, delete: if
debug(
debug(request.auth.uid) == debug(userId)
);
と書くことができ、firestore-debug.log には
string_value: "taro" // これが request.auth.uid
string_value: "jiro" // これが userId
bool_value: false // これが == の評価の結果
みたいなログが出力される。いわゆるプリントデバッグが可能になるのだけど、あるだけで十分挙動理解がしやすくなる。なお手元にログが吐かれるので、emurator限定だ。
request すべてを print する
allow list: if cond();
みたいの条件のときに debug() で request 全部を表示して確認したい。そんなときは
allow list: if debug(request) && false;
allow list: if cond();
と書くと、最初の行は必ず偽になるので debug(request) が実行され、かつ何もおこらず。セキュリティルールを並列で書いた時は OR マッチになるので、次の allow list: if cond();
の行は普通に評価される。
// allow list: if debug(request) && false;
allow list: if cond();
debug(request) を表示たくない場合は、こんな風にコメントアウトするだけなので楽。