Каков наилучший способ предоставить пользователю доступ для записи динамического файла в Firebase Storage? - PullRequest
0 голосов
/ 01 июня 2019

В моей системе есть объекты Media и User, и я использую Firebase Authentication, Storage и Firestore.

Отношения:

  1. Мультимедиа является автономной сущностью - и под этим я подразумеваю, что если у кого-то есть идентификатор этого носителя (идентификатор носителя) и некоторый код аутентификации (идентификатор носителя), он может загрузить носитель.
  2. Пользователь также должен иметь возможность загружать медиа, если у него есть действительный медиа-идентификатор и медиа-аутентификация

Требования безопасности, Пользователь или кто-то, у кого есть media-id и media-auth, должны иметь возможность загружать медиа с помощью клиента firebase и:

  1. Загрузите его только один раз.
  2. не может загрузить другой файл.

Итак, я подумал о том, чтобы создать собственную аутентификацию для медиа с UID = медиа-идентификатором, у него было бы право загружать только один файл, и только если он не существует. что-то вроде:

service firebase.storage {
  match /media/{mediaId}/video.mp4 {
      allow write: if resource == null && request.auth != null && request.auth.id == mediaId;
    }
  }
}

Проблема, с которой я сталкиваюсь, заключается в том, как дать Аутентифицированному пользователю разрешение на то же самое (у пользователя есть действительный идентификатор носителя и идентификатор носителя) и сделать это с помощью клиента firebase - это можно сделать с помощью некоторой функции. / Сервер легко, так как я могу проверить все, что я хочу перед загрузкой, но я пытаюсь избежать загрузки файлов с сервера.

Я нашел эту замечательную статью https://medium.com/@fpastorelima/per-user-storage-limit-validation-with-firebase-19ab3341492d, в которой показан способ сделать что-то похожее. Поскольку у меня уже есть собственный токен для носителя, я могу повторно подтвердить свою подлинность в качестве носителя, загрузить его и повторно подтвердить подлинность с пользователем полномочия.

Это выглядит как возможное решение, но я не могу сделать это в фоновом режиме - потому что в тот момент, когда я загружаю файл, я аутентифицируюсь как носитель и у меня не будет доступа к данным пользователей в Firestore. и доб .. так что мне нужно будет завершить, и только тогда я смогу продолжить - Проблема.

Я также подумал, что могу дать пользователю несколько временных пользовательских утверждений с помощью идентификатора носителя и добавить в правило что-то вроде этого:

service firebase.storage {
  match /media/{mediaId}/video.mp4 {
      allow write: if (resource == null && request.auth != null && request.auth.id == mediaId) 
                      || (request.auth.token.mediaId == mediaId);
    }
  }
}

Допустим, у меня будет работа, которая удалит это из утверждений через X минут, но я не знаю, правильно ли это используется для пользовательских утверждений ...

Правильно ли используется это пользовательское требование?

Может быть, в документации Firebase мне чего-то не хватает, что дало бы мне возможность сделать это?

Я скажу, что структура сущностей в базе данных не является окончательной - поэтому любые изменения в представлении данных, которые помогут решить эту проблему, будут приветствоваться.

...