先日、FlutterでFirestoreを利用している方がFirestoreに値を追加できないとのことだったので、その備忘録です!
実際に表示されたエラー
I/flutter (29667): Failed to add user: [cloud_firestore/permission-denied] The caller does not have permission to execute the specified operation.
原因
このエラーは、FireStoreの有効期限の設定を選択していない場合に出る、もしくは
Firestoreの有効期限が切れたときに生じるエラーになります。
有効期限の設定を選択していない場合のルール
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}
有効期限が切れた場合
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if
request.time < timestamp.date(2022, 10, 12);
}
}
}
Firebaseのルールに関して、気になる方は公式のドキュメントを見てみてください!
簡単に言うと、Railsのストロングパラメータのように
意図しない不正な値の挿入や改ざんの防止などを行うものです!
解決策
初めに、FirebaseConsoleに入り、Firestoreを選択後、下記の画像にある、「ルール」を押します。
次に、ルールを以下のように変更すれば大丈夫です!
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if
request.time < timestamp.date(2022, 12, 12);
}
}
}
timestamp.date(2022, 12, 12)
の中身はざっと30日後くらいにしておけば大丈夫です!
timestamp.date(年, 月, 日)
最後に、「公開」ボタンを押すと、変更完了です!
1分程度はルールの変更が適用されていない可能性があるので
少し待ってから再度実行すると良さそうです!
注意点
この他に、全ての読み書きを可能にする方法もありますが
セキュリティ上よろしくないので
以下のような内容は記載しないようにしましょう。
(公式ドキュメントにも避けるように記載されています)
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true;
}
}
}
参考文献