Предварительно подписанный URL для всего ведра - PullRequest
1 голос
/ 05 июля 2019

Я использую gsutil для создания предварительно подписанных URL-адресов для загрузки. При именовании объекта в корзине я могу успешно загрузить. Следующий фрагмент из gsutil отлично работает с PUT:

gsutil signurl -m PUT -d 10m -r eu ~/.ssh/mycreds.json gs://cjreyn-bucket-0/myobjectname.txt

Однако при указании только имени сегмента, а не объекта внутри него, загрузка произвольного объекта не работает:

gsutil signurl -m PUT -d 10m -r eu ~/.ssh/mycreds.json gs://cjreyn-bucket-0/

Возвращает след из завитка:

<?xml version='1.0' encoding='UTF-8'?><Error><Code>BucketAlreadyOwnedByYou</Code><Message>Your previous request to create the named bucket succeeded and you already own it.</Message></Error>

Моя строка скручивания выглядит следующим образом (подписанный URL-адрес заменен для краткости):

curl -X PUT --upload-file myobj.txt "<mysignedurl>"

Можно ли даже создавать подписанные URL-адреса для выгрузки и загрузки в / из целого сегмента, а не для каждого объекта в нем?

Ответы [ 2 ]

1 голос
/ 05 июля 2019

Нет, это невозможно.

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

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

Подписание URL PUT для самого контейнера разрешает владельцу этого URL отправлять запрос на созданиекорзина с таким именем, как следует из полученной ошибки.

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

Другой вариант может быть awscurl, который представляет собой инструмент, похожий на скручивание, который выполняет собственную подпись запроса.GCS имеет режим совместимости с AWS, так что это может означать, что вы можете использовать этот инструмент как есть, или, возможно, его можно адаптировать или, возможно, есть аналогичный инструмент для GCS.Но я предполагаю, что вам нужен подписанный URL в другом месте, а не на локальном компьютере, иначе вы просто использовали бы gsutil для загрузки.

0 голосов
/ 05 июля 2019

Это невозможно сделать, потому что предварительно подписанный URL действителен только для одного объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...