#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.