Правило Firestore, позволяющее пользователям получать только чаты, участниками которых они являются?Javascript

Форум по Javascript
Ответить
Anonymous
 Правило Firestore, позволяющее пользователям получать только чаты, участниками которых они являются?

Сообщение Anonymous »

У меня есть следующие документы чата:

Код: Выделить всё

{
members: ['abc','def'] // 2 element list of member UIDs
// some other chat metadata
}
В моей коллекции Firestore действуют следующие правила:

Код: Выделить всё

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();
Последнее предложение (

Код: Выделить всё

allow list: if authed();
) необходим, чтобы пользователи могли запускать следующий запрос в моем клиентском приложении:

Код: Выделить всё

    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)
);
Без этого я бы получил ошибку Firebase. Тем не менее, это правило по-прежнему разрешает любому пользователю извлекать чаты любого другого пользователя (я тестировал его, вручную заменяя UID другого пользователя вместо userId).
Из того, что я прочитал в этом последнем предложении, я не могу проверить фактическое предложениеwhere запроса и убедиться, что userId соответствует request.auth.uid, и что правило чтения, которое применяется к каждому отдельному сопоставленному документу должен запрещать чтение чатов других пользователей, но, похоже, у меня этого не происходит.
Может ли кто-нибудь помочь мне сказать, что я не так сделал в своем правиле? Вот фактическая полезная нагрузка для этого вызова:

Код: Выделить всё

{
"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
}
}
И это был декодированный токен носителя, с которым он был отправлен:
Изображение

Однако, когда я заменяю указанный выше идентификатор пользователя на UID другого пользователя ('5Sdmw2sxJBdp0YnW3LtqgfYMrW83', под которым я не аутентифицирован), вот возвращенный пример документа, который не следует возвращать, поскольку это должен быть частный разговор между двумя другими пользователями (ПРИМЕЧАНИЕ: на снимке экрана показаныmemberUids вместоmembers, поскольку я переименовал свойство, но предположим, что на фотографии значение называетсяmembers, чтобы совпадать со всеми ранее предоставленными фрагментами кода ):
Изображение


Подробнее здесь: https://stackoverflow.com/questions/798 ... members-of
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»