Firebase Security Rulesを使ってみて気づいたこと
Firebase Security Rulesを初めて記載したので、気づきをまとめていく。
公式ドキュメント
組み込み関数
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))
ルールプレイグラウンド
StorageやFirestoreのルール画面にはルールプレイグラウンドという機能があり、設定したルールが正しく挙動するかどうか動作確認することができる。
注意点
プレイグラウンドの機能は素晴らしいのだが、エラーメッセージが非常に不親切であるため、初めて使う際は要注意。
例えば、exists()
の引数の文字列が間違っているだけなのに、Function not found error: Name: [exists]
のようなメッセージが表示される。関数自体は存在しているはずなのに、関数が見つからないと言われると、「ドキュメント通りに書いてるのに存在しないの?」となってしまう。
もしこのエラーが表示された場合は、引数を間違えていないかどうか確認すると良い。