社会人から始めたプログラミング

プログラミング、エンジニアに関することでの備忘録、シェアしたい情報などを共有するためのブログです。

firebase の realtime database の REST API / firestore の REST API で security ruleを活用してデータ取得したい

やりたかったこと

unrealのアプリからREST APIでfirebaseのデータを活用しようとしたときに、 realtime database から security rules を適応した形で REST APIでデータ取得したかった。


問題

realtime databaseだとsecurity rules 無視して全部取得できてしまう。

参照: stackoverflow.com

*ちなみに、rest api で user 認証後にデータ取得する方法はこちらなどがあります。 (emailとpasswordでログインの例) firebase.google.com


結論

firestoreのほうならsecurity rulesかけたままデータ取得できた。

取得するための curl のコマンドを使用。 (まずはできることを確認するためにcurlがちょうど良かったので)

schedule(コレクション名)のuser_idが1のものを取得するためのcurlコマンド:

curl 'https://firestore.googleapis.com/v1/projects/[プロジェクトid([]はいらない。)]/databases/(default)/documents:runQuery?key=[特定のユーザーのidToken]' -X POST -H "Content-Type: application/json" -d '{"structuredQuery":{"where":{"fieldFilter":{"field":{"fieldPath":"user_id"},"op":"EQUAL","value":{"stringValue":"123"}}},"from":[{"collectionId":"schedule"}]}}'

*1

security rules例:

rules_version = 'x';
service cloud.firestore {
  match /databases/{database}/documents {
    ...
    match /schedule/{scheduleID} {
      allow read: if resource.data.user_id == "123";
      allow write: if request.resource.data.user_id == request.auth.uid;
    }
    ...
  }
}

・firestoreのrunQueryメソッドを利用しております。
 GETでなくてPOSTでqueryの結果取得してください。
 (GETでうまく行かないなぁとしばらく悩んだ。。orz)

・GETでcollection取得する場合は、listというメソッドを使っている模様。
 使えるparamsが一緒だった。最初、realtime data baseでつかえたlimitとか
 startAtとか使えないなぁと悩んでいた。

*改行など除きたい場合は下記のものなどで削除してください。 html-css-javascript.com

参照: https://stackoverflow.com/questions/49723881/firebase-firestore-rest-api-starting-query

*1:ちなみに、queryで取得したデータの中に制限かかっているデータが入ってたらpermissionエラー出ることを確認。ただ、rest apiからrequest.auth.uuidが取得できないみたいでやり方を考え中…