SignatureDoesNotMatch Ruby Rails Google 存储签名 URL

SignatureDoesNotMatch Ruby on Rails Google Storage Signed URL

我已使用 gem 'google-cloud-storage' 与 Google 存储建立连接。回购是 https://github.com/GoogleCloudPlatform/google-cloud-ruby/tree/master/google-cloud-storage.

signed_url 方法的示例我无法在 repo 的一个示例中找到它,这里是第 916 行: https://github.com/GoogleCloudPlatform/google-cloud-ruby/blob/master/google-cloud-storage/lib/google/cloud/storage/bucket.rb

我设法为特定文件的 GET 方法获得了签名 URL,但是当我尝试对文件的 signed_url 执行 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

application/x-www-form-urlencoded
1523909074
/bucket_name/logo1</StringToSign>
</Error>

PUT 示例代码(不工作):

require 'google/cloud/storage'
storage = Google::Cloud::Storage.new(
    project_id: 'projectId',
    credentials: './config/keyfile.json'
)

bucket = storage.bucket 'bucket_name'
signed_url = bucket.signed_url 'logo1.png',
                   method: 'PUT',
                   content_type: 'image/png',
                   expires: 300 # 5 minutes from now

我尝试过使用和不使用 content_type。我也试过 content_type: '*' 或 '**' 或 'image/*' 或 ''。 我在 Postman 和使用 primeng 上传组件的 Angular 应用程序中尝试了 PUT 请求。 需要一点帮助。谢谢。

一切都很好。我忘记在请求的 header 中添加 Content-Type。 我以为它隐含在签名url中,但没有。