Приложение, над которым я работаю, позволяет пользователям создавать компании на карте и загружать связанные изображения.
Я использую облачные функции, чтобы изменять размер изображений для различных разрешений экрана и загружать их обратно в 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>
Я вижу вышеуказанное сообщение для всех ранее загруженных изображений. Недавно загруженные изображения можно просматривать без проблем.
Мой код очень похож на этот пример, предоставляемый сэмплами функций, однако я беспокоюсь о том, чтобы перенести это в производство, если проблема станет повторяющейся.
Что может быть источником этой проблемы и есть ли способ защитить себя от нее в будущем?
Это случилось снова. Я решил это, добавив predefinedAcl: "publicRead"
в параметры метода upload
и сгенерировав статический URL-адрес, например: https://storage.googleapis.com/${bucketName}/${path}
Это облом. Мои пользователи будут запрашивать свежие downloadUrls через Firebase Storage API для каждого запроса.
Кажется, эта проблема связана с использованием 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 ()
@HadyRashwan Единственная альтернатива - использовать getDownloadURL () на стороне клиента с Firebase Storage. Вам нужно будет правильно настроить правила хранения, чтобы разрешить доступ для чтения аутентифицированным пользователям. Если вам нужен ролевой доступ с правилами безопасности, я предлагаю взглянуть на Custom Claims.
Я ответил на альтернативу signedURL, используя makePublic: stackoverflow.com/a/58016766/2713242
У меня была такая же проблема. Вы когда-нибудь находили корень проблемы или она никогда больше не возникала?