Gsutil подписанный Url помещенный в Google Cloud Storage терпит неудачу


Я бы хотел, чтобы пользователи сайта могли загружать файлы в google cloud storage без использования ресурсов серверов веб-приложений, поэтому подписанные URL-адреса кажутся подходящим способом.

Когда пользователь выбирает файл для загрузки, jquery отправляет запрос GET на django для подписанного url. Url-адрес генерируется с помощью команды gsutil signurl. Django возвращает подписанный URL-адрес шаблона и представить jquery PUT запрос направляется с подписанным URL-адрес.

Однако:

  • запрос PUT завершается с ошибкой "SignatureDoesNotMatch".
  • GET запросы на объекты хранения работают нормально, используя этот метод.

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

Команда Gsutil (предполагая, что пользователь выбрал файл ' map.HTML-код')...

gsutil signurl -p notasecret -m PUT -d 10m /path/to/.p12 gs://bucket_name/map.html

Jquery ввел код...

    $.ajax( {
  url: g_url,
  type: 'PUT',
  crossDomain: true,
  success: console.log('success'),
  error: function(XMLHttpRequest, textStatus, errorThrown){
    alert('status:' + XMLHttpRequest.status + ', status text: ' + XMLHttpRequest.statusText);
},
  data: file,
} );

G_url выглядит так...

https://storage.googleapis.com/bucket_name/map.html?GoogleAccessId=__retracted__&Expires=1408889274&Signature=rDJAZQG4MIyMupy0M8HJ17r8rkEJcAbYSWpcq084SdzRh%2BnZavTfuWl4Q%2F6ytkSkN2c2%2B4b4pPRF5eWOEOL1InRxlB5pEBedPFZPpgDrRvR9tFybtH%2BkesKLhIZ3WjJ0utzAwhl%2BgAlQY6ulvO0Djib20zcG5fkHOigpRf1xBUk%3D
1 5

1 ответ:

Оказывается, моя проблема была связана с Корсом. Чтобы заставить это работать на Django 1.6, я должен был сделать следующее:

С этим PUT и DELETE запросами начали работать. Единственной проблемой, с которой я столкнулся, были несовместимые заголовки контента. Таким образом, вам нужно установить свой тип контента в подписанном url и перед отправкой запроса.

Команда Gsutil будет выглядеть как

gsutil signurl -p notasecret -m PUT -d 10m -c 'multipart/formdata; charset=UTF-8' /path/to/.p12 gs://bucket_name/map.html

Добавить beforeSend в запрос jquery

beforeSend: function (request){
request.setRequestHeader("Content-Type", 'multipart/formdata; charset=UTF-8')
;},