

当初以下のように設定していました。これならエラーは出ないのですが、match /{document=**}
の部分ですべてのドキュメントのreadを許可しているので脆弱だというメッセージをもらい、変更を検討。

[code]

    rules_version = '2';
    
    service cloud.firestore {
      match /databases/{database}/documents {
      
        match /{document=**} {
          allow read : if true
        }
    
        match /users/{usersID} {
          allow write: if request.auth.uid == usersID
        }
        match /posts/{postsID} {
          allow write: if 'users/' + request.auth.uid != request.resource.data.user_id
        }
        
      }
    }
    
[/code]

そこでいったん以下のように変更しましたが、エラーとなりクライアント側からアクセスできなくなりました。

[code]

    rules_version = '2';
    
    service cloud.firestore {
      match /databases/{database}/documents {
    
        match /users/{usersID} {
            allow read ;
          allow write: if request.auth.uid == usersID
        }
        match /posts/{postsID} {
            allow read ;
          allow write: if 'users/' + request.auth.uid != request.resource.data.user_id
        }
        
      }
    }
    
[/code]

`Uncaught (in promise) FirebaseError: Missing or insufficient permissions.`

両者の設定でやっていることは同じに思えるので、エラーの理由が不明です。  
詳しい方、思い当たる原因を教えていただけますでしょうか。


CC BY-SA 4.0
2021-08-06T02:18:37.963
80630
2021-08-12T13:19:51.240
47607
question
firebase
firestore セキュリティルールのエラー


**※セキュリティ関連のトピックであり、注意が必要な内容を含みます。必ずご自身で確認・検証してください。**

恐らく、読み取りを許可していない階層に読み取り対象があるのだと思われます。

~~変更後のread権限の書き方にミスがあります。 アクセスできないのはそれが原因だと思います。 元の書き方と見比べてみてください。~~
※勘違いでした。申し訳ない。

ただし、個人情報などを含むデータに対して元の書き方をすると、全世界に対して読み取りの許可をした状態になります。適切な権限の設定が必要です。  
どのデータがprivateで、どのデータがpublicなのか切り分けが必要だと思われます。

firebaseはかなり自由度が高いので、難しく考えるよりは、階層構造そのものをprivateとpublicに分け、データを完全に分離するという手もあります。これはprivateゾーンでは本人のみアクセス可能、publicゾーンでは誰でもアクセス可能という権限を設定し、その権限に沿ったデータを格納するだけですが、簡単かつ堅牢です。


CC BY-SA 4.0
2021-08-09T13:22:10.953
80692
2021-08-12T13:19:51.240
2021-08-12T13:19:51.240
8795
8795
80630
answer