Не удается поместить файл в корзину облачного хранилища Google из JS в браузере

# #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()
 

Возникают две проблемы

  1. Я получаю ошибку CORS — ответ PUT не включает CORS-Allow-Origin: "*" заголовок.
  2. Когда я обхожу первую проблему с помощью плагина 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 при загрузке файла.