Хранилище Firebase: безопасный способ получить относительный путь к файлу? (Сохранение HTML-файла)

#firebase #google-cloud-storage #firebase-storage #firebase-security #banner

#firebase #google-облачное хранилище #firebase-хранилище #firebase-безопасность #баннер

Вопрос:

Привет StackOverflow и сообществу Firebase!

Я пытаюсь добиться чего-то, что, вероятно, не предназначено для Firebase: я хочу хранить папки HTML (рекламные баннеры в моем случае) в хранилище Firebase.

Мой вопрос таков: как сохранить относительный путь от моего HTML-файла к связанным JS-файлам и файлам изображений.

Чтобы эти файлы могли легко находить друг друга:

/path/to/my/folder/index.html

/path/to/my/folder/main.js

/path/to/my/folder/picture.jpg

 <html>
...
<script src="main.js">
...
</html>
  
 document.onload = function() {
    myImage.src = 'picture.jpg'
}
  

Эти относительные URL-адреса не работают, если я сохраняю все файлы в хранилище Firebase и получаю к ним доступ с помощью их downloadUrl, который выглядит как https://firebasestorage.googleapis.com/v0/b/my-project.appspot.com/o/my_folder_300x250/index.html?alt=mediaamp;token=12a123a1-1234-1a1a-1234-a1ab123456a1 ,

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

Мне также удалось заставить это работать в другом проекте, сделав хранилище Google Cloud Storage общедоступным. Я могу получить доступ к файлам и сохранить относительный путь, используя URL, подобный: https://my-project.appspot.com.storage.googleapis.com/path/to/my/folder/my_folder_300x250/index.html . Это отлично работает, но имеет серьезные недостатки безопасности, которые я хочу предотвратить, например, перечисление всех файлов в корзине 😱


Я попытался сохранить свои баннеры в виде zip-файлов, разархивировать их на интерфейсной стороне и воссоздать структуру папок в браузере с помощью FileSystem API. Но я ограничен Chrome.


Я мог бы также попытаться заменить все URL-адреса в моих файлах HTML, JS и CSS, но это не кажется хорошим решением.

Ответ №1:

Я нашел довольно простое решение:

В Google Cloud Console я создал новую роль, которая имеет доступ get, но не имеет доступа к списку, и применил ее к allUsers со следующими разрешениями.

resourcemanager.projects.get

storage.objects.get

На данный момент это решит мои проблемы, и я буду продолжать получать доступ к данным, используя ссылки типа https://my-project.appspot.com.storage.googleapis.com/path/to/my/folder/my_folder_300x250/index.html вместо downloadUrl() firebase.

Ответ №2:

Хранилище Firebase построено на основе облачного хранилища, в котором на самом деле нет каталогов, а есть единое пространство имен. Каталоги эмулируются с помощью соглашения об именовании объектов хранилища: имена могут содержать / символ, а при указании пути к «каталогу» в начале имени объекта создается впечатление, что этот объект находится в этом «каталоге». Посмотрите, как работают подкаталоги.

Итак, ваше единственное решение (если вы хотите хранить файлы независимо) — обработать все ссылки, сделать «пути» абсолютными и присвоить файлам соответствующие имена. Как вы заметили, вам, вероятно, также необходимо учитывать все параметры запроса URL.