Open3

Firebase Security Rulesを使ってみて気づいたこと

seitarofseitarof

組み込み関数

Security Rulesでは組み込み関数get()exists()を使うことができる。

引数

引数では/databases/$(databases)/documentsのように$()を使って変数を組み込むことができる。

StorageからFirestoreにアクセス

service firebase.storage の場合、Firestoreにアクセスする際はfirestore.get()のようにfirestore.というプレフィックスをつける必要がある。
また、組み込み関数は必ず/databases/(default)/documentsから始まる文字列でないとエラーが出る。

注意点

組み込み関数の引数にcustom tokenのデータを組み込む際に、ルールプレイグラウンドでは成功するが、実際にクライアントからアクセスすると想定通りの挙動にならない状況を観測した。
対処法としては、以下のようにint型に変換することで上手くいった。
/databases/(default)/documents/users/$(int(request.auth.token.userId))

seitarofseitarof

ルールプレイグラウンド

StorageやFirestoreのルール画面にはルールプレイグラウンドという機能があり、設定したルールが正しく挙動するかどうか動作確認することができる。

注意点

プレイグラウンドの機能は素晴らしいのだが、エラーメッセージが非常に不親切であるため、初めて使う際は要注意。
例えば、exists()の引数の文字列が間違っているだけなのに、Function not found error: Name: [exists]のようなメッセージが表示される。関数自体は存在しているはずなのに、関数が見つからないと言われると、「ドキュメント通りに書いてるのに存在しないの?」となってしまう。
もしこのエラーが表示された場合は、引数を間違えていないかどうか確認すると良い。