Правила безопасности Firebase Storage и токены загрузки для загружаемых файлов - PullRequest
1 голос
/ 05 июня 2019

TLDR: Это вопрос об URL-адресе, возвращенном из task.snapshot.ref.getDownloadURL() и соответствующем downloadToken.Он спрашивает о том, какова основная роль и функциональность token, и нужно ли это для файлов, которые будут общедоступны по правилам безопасности.


Я только что закончил руководства по загрузке изагрузка файлов в хранилище Firebase, найденное на https://firebase.google.com/docs/storage/web/upload-files, а также на этом руководстве по YouTube с официального канала Firebase .

Я строюСистема управления контентом для раздела блога в одном из моих веб-приложений Firebase (React + Firebase).

У меня есть компонент, который позволяет администратору выбрать изображение и загрузить его в корзину хранения Firebase для отображения вконкретное сообщение в блоге.Все изображения для определенного blogPost должны находиться в папке для определенного blog-post-slug.

Пример:

//bucket/some-blog-post-slug/image1.jpg

Код, который запускается всякий раз, когда администратор выбирает новый файлна <input type='file'/>:

function onFileSelect(e) {
  const file = e.target.files[0];
  const storageRef = firebase.storage().ref('some-slug/' + file.name);
  const task = storageRef.put(file);
  task.on('state_changed',
    function progress(snapshot) {
      setPercent((snapshot.bytesTransferred / snapshot.totalBytes) * 100);
    },
    function error(err) {
      console.log(err);
    },
    function complete() {
      console.log('Upload complete!');
      task.snapshot.ref.getDownloadURL().then(function(downloadURL) {
        console.log('File available at', downloadURL);
        props.changeImageSrc(downloadURL);
      });
    }
  );
}

Приведенный выше код возвращает downloadURL, который будет сохранен в Firestore в документе blogPost.

* downloadURLимеет следующий формат:

https://firebasestorage.googleapis.com/v0/b/MYFIREBASEAPP.appspot.com/o/some-slug%2FILE_NAME.jpg?alt=media&token=TOKEN_VALUE

Вы можете видеть, что он поставляется с «базовым URL»: https://firebasestorage.googleapis.com/v0/b/MYFIREBASEAPP.appspot.com/o/some-slug%2FILE_NAME.jpg

И basicURL сопровождается следующими параметрами GET:

alt=media и token=TOKEN_VALUE

Я не знал, что получу токен, поэтому ятеперь проверяем его поведение, чтобы узнать о нем больше.


ПОВЕДЕНИЕ С РАЗДЕЛАМИ ХРАНИЛИЩА:

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write;
}}}
  • Когда я получаю доступ кbasicURL:
  • Я получаю объект в ответ с данными загруженного файла:
{
  "name": "some-slug/FILE_NAME.jpg",
  "bucket": "MYBUCKET",
  "generation": "GENERATION_NUMBER",
  "metageneration": "1",
  "contentType": "image/jpeg",
  "timeCreated": "2019-06-05T13:53:57.070Z",
  "updated": "2019-06-05T13:53:57.070Z",
  "storageClass": "STANDARD",
  "size": "815155",
  "md5Hash": "Mj4aCPs21NUNxXpKg1bHirFIO0A==",
  "contentEncoding": "identity",
  "contentDisposition": "inline; filename*=utf-8''FILE_NAME.jpg",
  "crc32c": "zhkQMQ==",
  "etag": "CKu4a1+u2+0ucI412CEAE=",
  "downloadTokens": "TOKEN_VALUE"
}
  • Когда я получаю доступ к basicURL? alt = media
  • Отображается изображение.

  • Когда я получаю доступ к basicURL? Alt = media & token = TOKEN_VALUE

  • Изображение отображается.

ПОВЕДЕНИЕ С ЗАПИСЬЮ ХРАНИЛИЩА ОГРАНИЧЕНО:

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
}}}
  • Когда я получаю доступ к basicURL:
  • Я получаю следующий объект ошибки:
{
  "error": {
    "code": 403,
    "message": "Permission denied. Could not perform this operation"
  }
}
  • Когда я получаю доступ к basicURL? Alt = media
  • Я получаютот же объект ошибки:
{
  "error": {
    "code": 403,
    "message": "Permission denied. Could not perform this operation"
  }
}
  • Когда я получаю доступ к basicURL? alt = media & token = TOKEN_VALUE
  • Изображение отображается.

ЗАКЛЮЧЕНИЕ И ВОПРОСЫ

Мне кажется, что правило безопасности allow read: if request.auth != null; должно было блокировать любые чтения от неавторизованных пользователей, но с TOKEN параметр, файл доступен даже для запросов без объекта auth (Примечание: я не вошел в систему, когда выполнял тесты, описанные выше).

Я знаю, что не рекомендуется задавать больше вопросовn 1 вопрос, но в данном случае я думаю, что это необходимо:

ВОПРОС 1:

Для чего в основном используется этот токен и почему он переопределил authправить?

ВОПРОС 2:

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

  • Опция 1: разрешить чтение для всех и просто сохранить basicURL.

  • Вариант 2: ограничить чтение и сохранить токен basicURL +.

ВОПРОС 3:

Toотображать изображения в тегах <image src="imgSrc"> мне нужен параметр alt=media?Или окончание basicURL в FILE_NAME достаточно хорошо?

РЕДАКТИРОВАТЬ: ВОПРОС 3 ОТВЕТ: Просто проверил его и обнаружил, что параметр alt=media GET необходим для отображения изображения внутри<img> tag.


ПРИМЕЧАНИЕ: если вы загрузите один и тот же файл и замените старый, каждый раз вы будете получать token разное, а старшее token становится недействительным.

...