Я использовал 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, но с другим сообщением:
Анонимный вызывающий абонент не имеет доступа к хранилищу .objects.get к имени сегмента / файла.
Я также пробовал использовать код Go из этой ссылки. Результаты такие же.
Обратите внимание, что файлы без пробелов в имени по-прежнему могут быть успешно доступны через CDN.
Обновлять
- Чтобы уточнить, я думаю, что поведение CDN изменилось.
- Я предоставил CDN доступ к корзине GCS. Поэтому раньше CDN работал без проблем. Я только что дважды
gsutil iam ch serviceAccount:[email protected]: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 при доступе к "signedUrl" через браузер. Результатом является страница XML с <Code>AccessDenied</Code>
.