Как скрыть путь корзины Google Storage и имя изображения из URL - PullRequest
0 голосов
/ 25 апреля 2019

Я использую Google Storage для хранения фотографий профиля моих пользователей.У меня есть несколько тысяч картинок.

Теперь картинки сохраняются в ведре, например, так: data / images / profile / USER_ID.jpg

Итак, URL к изображению: https://storage.cloud.google.com/data/images/profiles/USER_ID.jpg

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

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

Существует ли способ сохранить имена файлов в том виде, в котором они находятся в хранилище,но просто скрыть путь + имя файла из URL?

https://storage.cloud.google.com/fc720d5c05411b03e5e2a6692f8d7d61.jpg -> points to https://storage.cloud.google.com/data/images/profiles/USER_ID.jpg

Спасибо

Ответы [ 3 ]

0 голосов
/ 25 апреля 2019

У вас есть несколько вариантов.Вот некоторые из них:

  • Пусть пользователи запросят URL-адрес другого пользователя с сервера, а затем сервер решит, разрешено ли пользователю просматривать изображение.Если это так, пусть сервер (у которого есть учетная запись службы) сгенерирует подписанный URL-адрес и передаст его обратно пользователю (или перенаправит на него).Таким образом, хотя пользователь может знать идентификатор пользователя другого пользователя и URL-адрес его изображения, он все равно не сможет увидеть изображение, если сервер не согласится, что это нормально.
  • Использование Firebase Storage для управленияизображения, которые по-прежнему будут хранить их в GCS, но обеспечат поддержку аутентификации Firebase.
  • Прокси-изображения через ваше приложение, либо приложение движка приложения, либо что-то работающее в GCE или GKE.Это позволяет скрыть все об источнике изображения, включая идентификатор пользователя, но имеет недостаток, заключающийся в том, что все данные должны проходить через ваш сервис.
  • Пересмотрите ваши требования.«Упрощенный поиск на стороне разработчика» может быть не так важен, как вы думаете, и вам нужно извлечь из этого выгоду в сравнении со стоимостью обходного пути.
0 голосов
/ 01 мая 2019

Другой вариант - Google Images API , доступный в AppEngine. Вы можете связать свои объекты облачного хранилища с Google Images API и использовать преимущества этого API - защищать URL-адреса, преобразовывать и изменять размеры изображений с помощью параметров URL-адресов. Вам нужно только подготовить serveURL для каждого изображения, хранящегося в GCS, и сохранить этот обслуживающий URL (например, в Google Datastore)

ImagesService imagesService = ImagesServiceFactory.getImagesService();
ServingUrlOptions suo = ServingUrlOptions.Builder
    .withGoogleStorageFileName(gcsImageObjectPath)
    .secureUrl(true);
String servingUrl = imagesService.getServingUrl(suo);
0 голосов
/ 25 апреля 2019

Тип URL, который вы публикуете:

https://storage.cloud.google.com/[BUCKET_NAME]/[OBJECT_NAME]

только для доступа к корзине или объекту непосредственно в браузере через Cloud Console .

Когда приложение хочет получить доступ к объекту, оно в основном выполняет HTTP-запрос GET к:

https://www.googleapis.com/storage/v1/b/[BUCKET_NAME]/o/[OBJECT_NAME]

Или использует Клиентская библиотека Cloud Storage .

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

Не используйте идентификаторы пользователей, адреса электронной почты, названия проектов, номера проектов илилюбая информация, идентифицирующая личность (PII) в именах сегментов, потому что любой может проверить наличие сегмента.Точно так же будьте очень осторожны с положением PII в имена объектов, потому что имена объектов появляются в URL для объекта.

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

...