Firebase を使った Web アプリで、Web UI にアクセスしたユーザーが Firestore のデータにアクセスするため ルールを設定してアクセス管理をしていたのだけど、ルールがデフォルトの状態に戻ってしまう現象が度々発生。
結論としては、firebase コンソール上で変更したものを、きちんとローカルの開発環境にある firestore.rules にも適用して直しておけ、というだけのことでした。
firestore.rules のデフォルト設定
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write;
}
}
}
これだと、Web UI 上の Javascript からアクセスすると誰でも読み書きできてしまうので、Firebase Console 上で以下のように設定して、認証されたユーザーIDを持つユーザーが自身のデータだけにアクセスできるようにしたい。
firestore.rules の変更後
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId}/{documents=**} {
allow read,write: if request.auth.uid == userId;
}
match /hp2fitconfig/client_id {
allow read: if request.auth.uid != null;
}
}
}
OAuth のトークン交換の際に必要となる、自身のアプリケーションの ClientID など共通の設定値にも Read 権限でアクセスできるようにしている。
不思議な現象
この設定でデータを保護しているつもりだったが、時たまこんなメールがくることがあって、そのたびに書き直すということをしていた。
[Firebase] Cloud Firestore データベースに安全でないルールがあります
なんとなく、開発作業中にデータの削除だったりを Firebase Console 上で操作したあとに来るような気がしていたので、Firebase Console 上でデータの削除とかをするとルールが変わってしまう仕様なのかと疑ったが、どうやらそうでもない。
最終的にたどり着いたのは、firebase Hosting の静的ファイル(HTML、Javascript、CSS)をアップロードするタイミングで発生していることがわかった。
firebase deploy
よくみたら、ローカルの firebase プロジェクトディレクトリに firestore.rules
があって、それが deploy されるタイミングでアップロードされて更新されていた、というオチだった。
結論
ローカルにある firestore.rules
で変更管理しましょう