Firestore のセキュリティルールのデバッグには debug() を使おう


Firestore のセキュリティルールは、テストを書きながら emurator で実行して問題ないかをチェックする、というのが一般的な方法。

ただ、いろいろなチュートリアルや書籍を見ていてもプリントデバッグができる debug() 関数が載っていなかった(エミュレータのみだからなのか、当たり前すぎるのか、みんな知らずに書いているのか…)ので書いておく。

の通り、使い方は単純で 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) を表示たくない場合は、こんな風にコメントアウトするだけなので楽。

もっと詳しい使い方