Добавление токена в Firebase Storage для безопасности группы - PullRequest
1 голос
/ 31 октября 2019

Для нашего приложения мы должны иметь возможность предлагать группам доступ к файлам. У каждого пользователя может быть большое количество групп, поэтому не имеет смысла использовать решение «пользовательский токен» (которое в любом случае очень неудобно.

Как я обнаружил, Firebase очень ограничен правилами безопасности хранилища. Основная проблема заключается в том, что мы сохраняем определения групп в Firestore, к которым правила безопасности хранилища не имеют доступа.

Чтобы преодолеть это, мы решили включить в метаданные каждого загруженного файла «токен», который любой вГруппа имеет доступ к. Когда они загружают файл, им нужно предоставить этот токен в параметрах запроса (например, /groups/xxx/filename.jpg?token=abc).

Поэтому я пошел дальше и написал этиправила:

match /groups/{groupId}/{filename} {
        allow read: if request.auth != null && request.params.token == resource.metadata.token;
        allow write: if request.auth.uid == userId
                    && request.resource.size < 1 * 1024 * 1024
                    && request.resource.contentType.matches('image/.*')
                    && (resource == null || request.resource.contentType == resource.contentType)
                    && imageId.size() < 32
     ;
}

Но когда я запускаю его в симуляторе, я получаю ошибку: «Ошибка: строка simulator.rules [23], столбец [43]. Свойство params не определено для объекта.», которое указываетк правилу с "request.params.token"

enter image description here

enter image description here

Документация специальнозаявляет, что мы имеемсс к объекту params из объекта запроса: https://firebase.google.com/docs/storage/security/secure-files?authuser=0#request_evaluation

enter image description here

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

В связи с серьезными ограничениями возможности Firebase запрашивать данные Firestore в хранилище и неверной документацией относительно request.param, недоступной, нам пришлось использовать другой подход.

Мы решили использовать следующееURL при запросе файлов группы:

/ groups / {groupId} / {token} / {имя_файла}

Единственное требование безопасности - вход пользователя в систему. токен является секретным и доступен только членам группы, мы считаем его довольно безопасным. Мы не разрешаем перечисление каталогов, поэтому невозможно просто перечислить / groups / {groupId}, чтобы найти какие-либо токены.

Примечание: другая оптимизация может состоять в том, чтобы не включать {groupId} в путь, номы чувствовали, что это лучше включить в целях отладки и управления.

Если кто-то считает, что это небезопасный способ, сообщите нам об этом в комментариях!

Спасибо!

0 голосов
/ 04 ноября 2019

Звучит так, будто вы пытаетесь передать некоторые данные из Cloud Firestore в запрос Cloud Storage для использования в правилах безопасности. В настоящее время это невозможно. (Вдобавок к этому request.params в настоящее время относится к API, которые не документированы, поэтому его нельзя реально использовать. Я обсудил это с командой, и мы считаем, что request.params, вероятно, следует удалить из правил безопасностидокументы.)

Если вы хотите назначить пользователю Firebase Auth некоторую групповую идентификацию, которую можно проверить по всем продуктам (Firestore, Storage и Realtime Database), вы можете использовать для этого пользовательских утверждений ,Потребуется определенная работа с вашим бэкэндом, чтобы назначить непосредственно учетной записи пользователя значения, которые вы хотите проверить. Если вы все сделаете правильно, значения, заданные в этом BLOB-объекте JSON, будут отображаться в request.auth.token в правилах безопасности Firestore и Storage .

...