2017-11-01 4 views
1

Firestoreのルールを設定して、文書のプロパティに含まれている値文字列のリスト文字列のリストは、Pythonのバックエンドによって生成されたFirebaseトークンの追加のクレームに含まれています。文書内のプロパティがトークン内の文字列のリストにある場合、読み取りを許可する追加のクレーム[Firestore]

service cloud.firestore { 
    match /databases/{database}/documents { 
    match /myList/{itemId} { 
     allow read: if resource.data.location_id in request.auth.token.locations 
    } 
    } 
} 

ただし、クエリを実行することは、まだすべての文書の代わりに、location_idのは、我々は、追加の特許請求の範囲に入れて、リストにあるものだけを返します。これがthe bug mentioned in this postに関連するかどうか、またはFirestoreのルールで構文が間違っているかどうかはわかりません。

私のfirestore構造は、ここでmyList/{itemId}/(item properties here, including location_id property which looks like location_id: "7")

のように見える私はこのルールを実装しようとするために参照していますdocumentationです。 とリストを取得:読み込み、クラウドFirestoreでクエリに

また、マニュアルに従って、

は、2つの操作があります。これらは、クライアントライブラリ内のget()およびwhere()。get()(クエリ)メソッド、 メソッドに対応します。便宜のために、 の読み取り操作では、これらの両方が可能です。

したがって、読み取りを指定すると両方の場合に対応する必要があります。 「私は、次のように単一の値をハードコーディングしようとしている が、私のことができます。私はまた、クレームが正しく追加されていることを確認するために私firebaseトークンをデコードするhttps://jwt.io/を使用し、それは確かに私のトークン

"claims": { 
    "locations": [ 
     "6" 
    ] 
    }, 

編集の内側を示してそれを働かせても、それでもすべての文書が返されています。

service cloud.firestore { 
    match /databases/{database}/documents { 
    match /myList/{itemId} { 
     allow read: if resource.data.location_id == '6' 
    } 
    } 
} 

答えて

0

短い答えはin ['foo', 'bar']が現在のクエリ制約としてサポートされていない条件の暗黙のOR、での結果であるということです。あなたはこのORが明示的になり、ルールを記述する必要があります現時点では

// works fine for single gets 
allow get: if resource.data.itemId in ['foo', 'bar'] 
// need to expand this for queries 
allow list: if resource.data.itemId == 'foo' || resource.data.itemId == 'bar' 
+0

ので 'サービスcloud.firestore { 一致/データベース/ {データベース}/{文書 一致/はmyList/{ itemId} { ['7']のget:if resource.data.itemIdを許可します。 許可リスト:if resource.data.itemId == '7' || resource.data.itemId == '7' } } } '? – wizloc

+0

ひとつのアイテムしか持っていない場合は、 '[7 ']'を使う必要はありません。 '==' 7 ''だけ使うことができます。 「7」(文字列)と「7」(数字)を確実に区別したいことに注意してください。 –

関連する問題