Я использовал Google Cloud CDN для кэширования контента из корзины GCS в течение нескольких месяцев.До вчерашнего дня (2019/09/19) я заметил, что не могу получить доступ к объекту с пробелами в его имени.Обычно я применяю encodeURIComponent
к имени объекта перед подписанием всего URL, который до вчерашнего дня работал нормально.
Вот что я пробовал до сих пор с утилитой gcloud
:
Подпишите URL-адрес без URL-кодировки имени файла:
$ gcloud compute sign-url --key-name my-key --key-file my-key --expires-in 15m "https://cdn.example.com/file-with-white space.txt"
Затем я получил доступ к URL-адресу с %20
и без него.Результат - 403, показанный на изображении .
. Подпишите URL-адрес именем файла в кодировке URL (это то, что я делал месяцами,и все работало нормально):
$ gcloud compute sign-url --key-name my-key --key-file my-key --expires-in 15m "https://cdn.example.com/file-with-white%20space.txt"
Результат также 403, но с другим сообщением :
У анонимного абонента нет доступа к storage.objects.get к номеру корзины / имени файла
Я также пытался использовать код Go по этой ссылке .Результаты совпадают.
Обратите внимание, что к файлам без пробелов в названии по-прежнему можно успешно обращаться через CDN.
Обновление
- Чтобы уточнить, я думаю, что поведение CDN изменилось.
- Я предоставил CDN доступ к корзине GCS.Поэтому CDN раньше работал без проблем.На самом деле я просто дважды выполнил
gsutil iam ch serviceAccount:service-PROJECT_NUM@cloud-cdn-fill.iam.gserviceaccount.com:objectViewer gs://[BUCKET]
, чтобы убедиться в этом. - Я пытался подписывать URL-адреса GCS, используя
gsutil
напрямую, без использования CDN, и подписанный URL работал.
Обновление 2
Я опробовал --validate
вариант.Вот что я получил:
$ gcloud compute sign-url --key-name cdn-signing-key \
--key-file cdn-signing-key --expires-in 15m \
--validate "https://cdn.domain.com/file%20with%20space"
signedUrl: https://cdn.domain.com/file%20with%20space?Expires=1569075302&KeyName=cdn-signing-key&Signature=e3SANudKHIT5txHWVlO1oijItXw=
validationResponseCode: 200
И все же я все равно получил 403 при доступе к «signUrl» через браузер.В результате получается страница XML с AccessDenied
.