Облачное хранилище Google: настройки CORS не работают для подписанных URL-адресов - PullRequest
1 голос
/ 17 апреля 2019

Ответ PUT на запрос со подписанным URL не содержит заголовок Access-Control-Allow-Origin.

import os
from datetime import timedelta

import requests
from google.cloud import storage

os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = <path to google credentials>
client = storage.Client()
bucket = client.get_bucket('my_bucket')
policies = [
    {
        'origin': ['*'],
        'method': ['PUT'],
    }
]
bucket.cors = policies
bucket.update()
blob = bucket.blob('new_file')
url = blob.generate_signed_url(timedelta(days=30), method='PUT')
response = requests.put(url, data='some data')

for header in response.headers.keys():
    print(header)

Выход:

X-GUploader-UploadID
ETag
x-goog-generation
x-goog-metageneration
x-goog-hash
x-goog-stored-content-length
x-goog-stored-content-encoding
Vary
Content-Length
Date
Server
Content-Type
Alt-Svc

Как видите, нет CORS-заголовков. Итак, могу ли я заключить, что GCS не поддерживает CORS должным образом / полностью?

1 Ответ

1 голос
/ 18 апреля 2019

Обмен ресурсами между источниками (CORS) позволяет взаимодействовать между ресурсами из разных источников. По умолчанию в облачном хранилище Google это запрещено / отключено для предотвращения злонамеренного поведения.

Вы можете включить его, используя Облачные библиотеки , Rest API или Cloud SDK, учитывая следующие правила:

  1. Проверка подлинности с использованием учетной записи пользователя / службы с разрешениями для типа облачного хранилища: FULL_CONTROL.

  2. Использование XML API для получения правильных заголовков CORS, используйте один из двух URL:

- storage.googleapis.com/[BUCKET_NAME]
- [BUCKET_NAME].storage.googleapis.com

Origin storage.cloud.google.com/[BUCKET_NAME] не будет отвечать заголовком CORS.

  1. Запросите правильный заголовок ORIGIN для соответствия политике ORIGIN в конфигурации корзины, как указано в пункте 3 документации по устранению неполадок CORS , в случае вашего кода:
headers = {
    'ORIGIN': '*'
}
response = requests.put(url, data='some data', headers=headers)

for header in response.headers.keys():
    print(header)

дает следующий вывод:

X-GUploader-UploadID
ETag
x-goog-generation
x-goog-metageneration
x-goog-hash
x-goog-stored-content-length
x-goog-stored-content-encoding
Access-Control-Allow-Origin
Access-Control-Expose-Headers
Content-Length
Date
Server
Content-Type
...