はじめに
Flutterエンジニアとして修行中のあんりと申します!
現在入っているプロジェクトで、Firebaseのセキュリティルールに関するエラーに遭遇し、勉強をしたので、アウトプットも兼ねて記事を書くことにしました🚀
今回起こった問題
- Firestoreの、qrsコレクションのフィールドの値を更新するため、下記のコードを書き、実行したら処理途中で落ちてエラーが吐かれる。
↓ 実行したいコード
// qrsコレクションのgroupNameを更新する
Future<void> updateQrInfoGroupName(String groupName) async {
final qrNumber = await fetchQrNumberString();
final docRef = qrsReference.doc(qrNumber);
// ここで落ちてエラーが吐かれる
await docRef.update({'groupName': groupName});
}
↓ 吐かれるエラー
[cloud_firestore/permission-denied]The caller does not have permission to execute the specified operation.
エラーの原因調査
-
一番下の行について
allow read, write: if request.auth != null;
→「authにログインしてなければ読み書きできない(=authでログインしてれば読み書き可能)」という内容で書かれている。
ただ、authでログインをしている状態でアプリを動かしているので、エラーが出る謎が深まる。
エラーの原因となってたセキュリティルールは、「Firestore Database」の方にあった!
-
この中の、qrsコレクションへのセキュリティルールの箇所 ↓
match /qrs/{gr} { // authでログインしてればドキュメント作成と、データ取得は可能 allow read, create: if request.auth != null; // updateとdelete(削除や更新)は許可されていない allow update, delete: if false; }
ここでupdateが許可されていないのが原因だった!
なので、updateを許可するように修正が必要。
解決 - セキュリティールールを修正・公開
- updateの場所を下記のように変更
match /qrs/{gr} { allow read, create, update: if request.auth != null; allow delete: if false; }
- 下記を参考にしてルールプレイグラウンドでテスト
https://firebase.google.com/docs/rules/simulator?hl=ja - テスト実行 →「シミュレートされた読み取りが許可されました」と出て、テスト成功
- 「公開」で修正後のセキュリティルールを反映
- 反映後、シミュレーターを動すと、エラー吐かずに無事にフィールドの値が更新できた!
解決🎉🎉
おわりに
まだ知識と経験が浅いため、誤った箇所などありましたら、ご意見やご指摘などいただけたら幸いです!
そしてもしこの記事がどなたかのお役に立てたら嬉しいです!
読んでいただきありがとうございました!🙇♀️