Google Cloud CDN не может получить доступ к файлу с пробелами из бэкэнда GCS - PullRequest
0 голосов
/ 20 сентября 2019

Я использовал Google Cloud CDN для кэширования контента из корзины GCS в течение нескольких месяцев.До вчерашнего дня (2019/09/19) я заметил, что не могу получить доступ к объекту с пробелами в его имени.Обычно я применяю encodeURIComponent к имени объекта перед подписанием всего URL, который до вчерашнего дня работал нормально.

Вот что я пробовал до сих пор с утилитой gcloud:

  1. Подпишите 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, показанный на изображении .

  2. . Подпишите 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.


Обновление

  1. Чтобы уточнить, я думаю, что поведение CDN изменилось.
  2. Я предоставил CDN доступ к корзине GCS.Поэтому CDN раньше работал без проблем.На самом деле я просто дважды выполнил gsutil iam ch serviceAccount:service-PROJECT_NUM@cloud-cdn-fill.iam.gserviceaccount.com:objectViewer gs://[BUCKET], чтобы убедиться в этом.
  3. Я пытался подписывать 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.

Ответы [ 2 ]

0 голосов
/ 23 сентября 2019

Этим утром я снова попытался получить доступ к недавно подписанному URL-адресу файла с пробелами.Я заметил кое-что интересное.

  • Иногда CDN работает и возвращает 200 вместе с содержимым файла.
  • В некоторых других случаях CDN получает 301 в качестве ответа от серверной частиservice (в данном случае это GCS-контейнер), а затем перенаправляет меня на URL-адрес корзины, который в свою очередь возвращает 403 вместе со страницей XML.
  • Поэтому я попытался изменить разрешение корзины на Public.Если CDN работает, я получу 200, как и раньше.Если CDN перенаправит меня в корзину, теперь я получу 200 вместе с файлом.

Поэтому я закрываю этот вопрос, так как думаю, что он больше не имеет ничего общего с именем файла.Кажется, CDN не кэширует для меня содержимое и вместо этого пытается направить мне исходный файл в корзине.Я не уверен, является ли это нормальным поведением CDN, но я проведу еще несколько исследований по этому вопросу.

0 голосов
/ 21 сентября 2019

Я не могу воспроизвести это.

Имя файла (в кодировке URL) с пробелами в корзине GCS может быть подписано и проверено:

➜  gcloud compute sign-url --key-name "backend-key" \
  --key-file backend.key --expires-in 7d \
  --validate "https://cloud-cdn.questionable.services/file%20with%20spaces.txt"

signedUrl: https://cloud-cdn.questionable.services/file%20with%20spaces.txt?Expires=1569639576&KeyName=backend-key&Signature=pTsgDpBOpBcqHDNeTWFfFcTC2Ws=
validationResponseCode: 200

Без кодировки URLпроверка и подпись завершаются неудачно (как и ожидалось), поскольку gcloud не выполняет автоматическое процентное кодирование URL-адресов в процентах:

➜  gcloud compute sign-url --key-name "backend-key" \
  --key-file backend.key --expires-in 7d \
  --validate "https://cloud-cdn.questionable.services/file with spaces.txt"

signedUrl: https://cloud-cdn.questionable.services/file with spaces.txt?Expires=1569639586&KeyName=backend-key&Signature=AiJEBO6sHGgJh8EshLAH2IXlxe0=
validationResponseCode: 400

Не было никаких изменений ни в алгоритме подписи на стороне Cloud CDN, ни в sign-url команда в gcloud SDK.В прошлом мы неявно не кодировали URL-адрес входного URL.

...