Firestore-Regel, die es Benutzern erlaubt, nur Chats abzurufen, in denen sie Mitglied sind?JavaScript

Javascript-Forum
Anonymous
 Firestore-Regel, die es Benutzern erlaubt, nur Chats abzurufen, in denen sie Mitglied sind?

Post by Anonymous »

Ich habe Chat-Dokumente wie die folgenden:

Code: Select all

{
members: ['abc','def'] // 2 element list of member UIDs
// some other chat metadata
}
Im Firestore habe ich die folgenden Regeln für meine Sammlung:

Code: Select all

function authed() {
return request.auth != null;
}

match /chats/{chatId} {

allow create: if authed()
&& request.resource.data.members is list
&& request.resource.data.members.size() == 2
&& request.auth.uid in request.resource.data.members;

allow read, update: if authed()
&& resource.data.members is list
&& request.auth.uid in resource.data.members;

allow list: if authed();
Die letzte Klausel (

Code: Select all

allow list: if authed();
) ist erforderlich, damit Benutzer die folgende Abfrage in meiner Client-App ausführen können:

Code: Select all

    const chatsRef = collection(firestoreDb, 'chats');

const LAST_MESSAGE_AT_PROPERTY: keyof Chat = 'lastMessageAt';
const MEMBER_PROPERTY: keyof Chat = 'members';
const q = query(
chatsRef,
where('members', 'array-contains', userId),
orderBy('lastMessageAt', 'desc'),
limit(20)
);
Ohne es würde ich einen Firebase-Fehler erhalten. Allerdings erlaubt diese Regel immer noch jedem Benutzer, die Chats anderer Benutzer abzurufen (ich habe es getestet, indem ich die Benutzer-ID manuell durch die UID eines anderen Benutzers ersetzt habe).
Nach dem, was ich zu dieser letzten Klausel gelesen habe, gibt es keine Möglichkeit, die where-Klausel der tatsächlichen Abfrage zu überprüfen und sicherzustellen, dass userId mit request.auth.uid übereinstimmt und dass die Leseregel, die für jede Person gilt, übereinstimmt Das Dokument sollte das Lesen der Chats eines anderen Benutzers verhindern, aber das scheint bei mir nicht zu passieren.
Könnte mir jemand helfen und sagen, was ich in meiner Regel falsch gemacht habe? Hier war die tatsächliche Nutzlast für diesen Anruf:

Code: Select all

{
"database": "projects/my-project/databases/(default)",
"addTarget": {
"query": {
"structuredQuery": {
"from": [{ "collectionId": "chats" }],
"where": {
"fieldFilter": {
"field": { "fieldPath": "members" },
"op": "ARRAY_CONTAINS",
"value": { "stringValue": "5Sdmw2sxJBdp0YnW3LtqgfYMrW83" }
}
},
"orderBy": [
{
"field": { "fieldPath": "lastMessageAt" },
"direction": "DESCENDING"
},
{ "field": { "fieldPath": "__name__" }, "direction": "DESCENDING" }
],
"limit": 20
},
"parent": "projects/my-project/databases/(default)/documents"
},
"targetId": 2
}
}
Und dies war das entschlüsselte Trägertoken, mit dem es gesendet wurde:
Image

Allerdings, wenn ich die obige Benutzer-ID durch die UID eines anderen Benutzers ersetze ('5Sdmw2sxJBdp0YnW3LtqgfYMrW83', als wen ich nicht authentifiziert bin), hier ist ein zurückgegebenes Beispieldokument, das nicht zurückgegeben werden sollte, da es sich um eine private Konversation zwischen zwei anderen Benutzern handeln sollte (HINWEIS: Der Screenshot zeigt memberUids anstelle von member, da ich die Eigenschaft umbenannt habe, aber gehen Sie davon aus, dass der Wert im Foto Members heißt, um mit allen zuvor bereitgestellten Codeausschnitten übereinzustimmen ):
Image

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post