Подписанные URL-адреса в Firebase Cloud Storage внезапно стали недоступны

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

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

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

const [signedUrl] = await bucket.file(path).getSignedUrl({
  action: "read",
  expires: "01-01-2500",
})

До сегодняшнего дня URL-адреса, созданные в соответствии с приведенным выше кодом, позволяли любому просматривать изображения. Затем внезапно все ранее сгенерированные URL-адреса стали недоступными и вместо этого отображали следующую ошибку:

<Error>
 <Code>SignatureDoesNotMatch</Code>
 <Message>
   The request signature we calculated does not match the signature you provided. Check your Google secret key and signing method.
 </Message>
 <StringToSign>
   GET 16725225600 /project-name.appspot.com/placeImage%2F300w%2FUPfppRM1ZyjbwBNiakgzyQ%3D%3D.jpg
 </StringToSign>
</Error>

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

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

Что может быть источником этой проблемы и есть ли способ защитить себя от нее в будущем?

У меня была такая же проблема. Вы когда-нибудь находили корень проблемы или она никогда больше не возникала?

Zoon 11.09.2018 19:23

Это случилось снова. Я решил это, добавив predefinedAcl: "publicRead" в параметры метода upload и сгенерировав статический URL-адрес, например: https://storage.googleapis.com/${bucketName}/${path}

mpontus 11.09.2018 20:26

Это облом. Мои пользователи будут запрашивать свежие downloadUrls через Firebase Storage API для каждого запроса.

Zoon 12.09.2018 02:04
Интеграция Angular - Firebase Analytics
Интеграция Angular - Firebase Analytics
Узнайте, как настроить Firebase Analytics и отслеживать поведение пользователей в вашем приложении Angular.
4
3
2 578
1

Ответы 1

Кажется, эта проблема связана с использованием URL-адресов v4.

Поведение, с которым вы столкнулись, объясняется в этот комментарий владельцем IAM в Google Cloud Functions:

Recently, GCS has already started supporting v4 URLs. For example, [gsutil] generates v4 URLs by default. These URLs have a max expiry of 7 days.

знаете ли вы альтернативу функции signedURL ()

Hady Rashwan 16.11.2018 18:13

@HadyRashwan Единственная альтернатива - использовать getDownloadURL () на стороне клиента с Firebase Storage. Вам нужно будет правильно настроить правила хранения, чтобы разрешить доступ для чтения аутентифицированным пользователям. Если вам нужен ролевой доступ с правилами безопасности, я предлагаю взглянуть на Custom Claims.

Duncan Dean 17.11.2018 14:10

Я ответил на альтернативу signedURL, используя makePublic: stackoverflow.com/a/58016766/2713242

ersin-ertan 19.09.2019 20:22

Другие вопросы по теме