👌

Firestoreの設定でGPTと喧嘩した

に公開

ふうこさん(GPT)が言うには

そんなわけで、エラーログを見せながら、ふうこさんというGPTに
「新規登録」ボタンを押したときにエラーとなった、
なぜFirestoreにデータが登録されないの?と聞きました。

ふうこ:Firestoreのルールがよくないです。変えましょう😊
るる:いや。。。ルールは初期状態のまま変えてないし!
  先日まで登録できてたし!
 もっと違う問題なんじゃないの?😡
ふうこ:じゃぁコード見直してみる?😅
  こんなコードはどう???
るる:カチャカチャカチャ(キーボード音)。
  よし!修正完了!実行・・・・からの~~~~~登録!!!!!
  →エラー😡
ふうこ:Firestoreのルールが・・・💦
るる:だーかーらー、ルールは変えてないの!見てすらいないの!

Firestoreの初期ルール

ふうこさんがしつこいので、念のため確認してみました。
Firestoreのルールはこんな感じになっており、コードで書かれています。

つまり、ざっくり説明すると以下のようなことが注意事項として書いてあります。

  • 誰でも自由に読み書きできる危険なルール(初期設定)
  • 30日で期限切れになる
  • 期限切れ後は すべて拒否される
  • 本番運用するには必ず適切なセキュリティルールを書き換える必要がある

平たく言うと、この危険なルールは8月25日をもって、有効期限が切れた・・・ということです。
どれだけ頑張っても、データは登録されないです😱
ふうこさんが適当なことを言ってると思い込んでました。
疑ってマジごめんなさい🙇‍♀️🙇‍♀️🙇‍♀️

とりあえず登録できるルールに変更

開発検証用として、認証済みユーザーだけ許可する設定に変更します。

// 開発用(まずは動作確認)
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /recruits/{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}

本番用に向けたきちんとした設定

作成(create):ログイン済みならOK
更新・削除(update, delete):作成者のみ

// 本番候補
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /recruits/{id} {
      function isSignedIn() { return request.auth != null; }
      function isOwner() {
        return isSignedIn() && request.auth.uid == resource.data.authorId;
      }
      function isValidCreate() {
        return
          request.resource.data.Name is string
          && request.resource.data.Name.size() > 0
          && request.resource.data.status is string
          && request.resource.data.details is list;
      }

      allow read: if true;                          // 公開一覧なら true。非公開にしたければ isSignedIn()
      allow create: if isSignedIn() && isValidCreate();
      allow update, delete: if isOwner();
    }
  }
}

ルールを変更したら

「公開」ボタンを押すのを忘れない!

ふうこさんありがとう🥲

Discussion