Сигнатура ошибки не соответствует. Сегмент облачного хранилища Google PUT

Я схожу с ума.

Я использую Shrine (https://github.com/janko-m/shrine) с Google Cloud Storage (https://github.com/renchap/shrine-google_cloud_storage), но когда я запускаю вызов PUT, я получаю следующее:

<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>
PUT
image/jpeg
1518399402
/mybucket.appspot.com/7d5e4aad1e3a737fb8d2c59571fdb980.jpg
</StringToSign>
</Error>

Я следил за этой информацией (http://shrinerb.com/rdoc/classes/Shrine/Plugins/PresignEndpoint.html) для presign_endpoint, но ничего:

class FileUploader < Shrine
  plugin :presign_endpoint, presign_options: -> (request) do
    filename     = request.params["filename"]
    extension    = File.extname(filename)
    content_type = Rack::Mime.mime_type(extension)

    {
      content_type: content_type
    }
  end
end

Я пробовал с этим и без него (каждый раз перезапуская сервер Rails).

Где я не прав?

Я также пытался использовать Postman с PUT для этого URL и без какого-либо content-type. Но все равно ничего.

Я прочитал здесь: https://github.com/GoogleCloudPlatform/google-cloud-node/issues/1976 и здесь: https://github.com/GoogleCloudPlatform/google-cloud-node/issues/1695

Как я могу попробовать без Rails?

Есть ли REPL (или аналогичный), который можно попробовать с моими учетными данными и с файлом?


person Community    schedule 12.02.2018    source источник


Ответы (1)


У вас есть несколько вариантов простой загрузки файла в Google Cloud Storage, как показано в официальные документы здесь.

Например, если вы хотите использовать клиентскую библиотеку Ruby, вы можете использовать этот код:

# project_id        = "Your Google Cloud project ID"
# your-bucket-name       = "Your Google Cloud Storage bucket name"
# local_file_path   = "Path to local file to upload"
# storage_file_path = "Path to store the file in Google Cloud Storage"

require "google/cloud/storage"

storage = Google::Cloud::Storage.new(project: "your-project_id")
bucket  = storage.bucket "your-bucket-name"

file = bucket.create_file "local_file_path", "storage_file_path"

puts "Uploaded #{file.name}"

Вам нужно будет:

Задайте для переменной среды GOOGLE_APPLICATION_CREDENTIALS путь к файлу JSON, содержащему ключ вашей учетной записи службы.

как вы можете видеть в документации по Cloud Storage Client Libraries. .

Однако похоже, что используемый вами репозиторий github использует подписанные URL-адреса. . Если вам нужно создать подписанный URL-адрес, у вас есть инструкции. здесь. Он уже существует метод signed_urls для Ruby в официальный репозиторий.

В любом случае, ошибка, которую вы получили, связана с тем, что с подписанными URL-адресами было что-то не так. И именно там была фиксация репозитория, на который вы ссылались (https://github.com/renchap/shrine-google_cloud_storage) 7 дней назад с именем исправить предварительно подписанные загрузки . Похоже, что этот коммит должен исправить загрузку «PUT» (до того, как был подписан «GET», поэтому он не будет работать). Тем не менее, я не пробовал, поэтому я не знаю, действительно ли это работает.

person VictorGGl    schedule 20.02.2018
comment
Это исправление последовало за моим вопросом. - person ; 20.02.2018