# #javascript #python #cors #gcloud #digital-signature
Вопрос:
Я использую google-облачное хранилище для создания URL-адреса с подписью для загрузки файла из браузера.
BUCKET.cors = [
{
"origin": ["*"],
"responseHeader": [
"Content-Type",
"x-goog-resumable"],
"method": ['PUT', 'POST'],
"maxAgeSeconds": 3600
}
]
BUCKET.patch()
blob = BUCKET.blob(blob_name)
url = blob.generate_signed_url(
version="v4",
# This URL is valid for 15 minutes
expiration=datetime.timedelta(minutes=15),
# Allow PUT requests using this URL.
method="PUT",
content_type="application/octet-stream",
)
URL-адрес, который я получаю, выглядит так. То blob_name
Я использую это "<UUID>/<UUID>/test.png"
.
Затем я PUT
fetch
перешел к возвращенному URL-адресу.
const {signed_url} = await(await fetch(baseUrl "/upload/signed?blob_name=" path, {
credentials: "include",
})).json();
console.log('url', signed_url);
// upload to google
const url = await (await fetch(signed_url, {method: "PUT", body: file}) ).json()
Возникают две проблемы
- Я получаю ошибку CORS — ответ PUT не включает
CORS-Allow-Origin: "*"
заголовок. - Когда я обхожу первую проблему с помощью плагина CORS, я получаю следующий ответ:
<?xml version='1.0' encoding='UTF-8'?><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>GOOG4-RSA-SHA256
20210910T200720Z
20210910/auto/storage/goog4_request
3df68a505fbb635cc4092462461b715ad31b4e83db668726ca5d87ebe1d64d9a</StringToSign><CanonicalRequest>PUT
/my-project-dev/edb5b48fcd724ab4a46afff3da5efa20/5b76eed38ed2473ea7c0b83e0e1d081c/52b675f15e2147849c911fe4f35951e9/test.png
X-Goog-Algorithm=GOOG4-RSA-SHA256amp;amp;X-Goog-Credential=dev-laptop@my-project.iam.gserviceaccount.com/20210910/auto/storage/goog4_requestamp;amp;X-Goog-Date=20210910T200720Zamp;amp;X-Goog-Expires=900amp;amp;X-Goog-SignedHeaders=content-type;host
content-type:image/png
host:storage.googleapis.com
content-type;host
UNSIGNED-PAYLOAD</CanonicalRequest></Error>
Я попытался найти примеры JS fetch на stackoverflow и сайте документации gcloud. Я также проверил, есть ли опция для библиотеки python, которой мне не хватает. Теперь у меня нет выбора. Похоже, что ведра для хранения не были предназначены для этого случая использования. Помощь была бы очень признательна.
Комментарии:
1. Это ответ на ваш вопрос? github.com/googleapis/google-cloud-node/issues/. … Как уже упоминалось здесь, cloud.google.com/storage/docs/access-control/… , «По мере необходимости. Если вы предоставляете тип содержимого, клиент (браузер) должен предоставить этому заголовку HTTP то же значение».
2. Да, спасибо. Если вы подадите ответ, я его приму.
Ответ №1:
Как упомянула Мейбл А. в комментариях:
Проблема заключалась в несоответствии типа контента при создании PSL.
Мне нужно было иметь тип содержимого: application/octet-stream
при загрузке файла.