Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ruby aws sdk gem和预签名pos进行签名不匹配_Ruby_Amazon S3_Aws Sdk - Fatal编程技术网

使用ruby aws sdk gem和预签名pos进行签名不匹配

使用ruby aws sdk gem和预签名pos进行签名不匹配,ruby,amazon-s3,aws-sdk,Ruby,Amazon S3,Aws Sdk,我需要一些帮助来让新的ruby工作。我使用的是地区eu-central-1,因此所有请求都需要使用最新的签名方法v4 实际上,我想创建一个预先签名的post url,将其与jquery fileupload结合使用。我已经用所有的访问密钥、bucket、CORS配置等正确地设置了S3,但是每次我都用下面的代码生成一个url @signer = Aws::S3::Presigner.new @url = @signer.presigned_url(:put_object, bucket: ENV[

我需要一些帮助来让新的ruby工作。我使用的是地区
eu-central-1
,因此所有请求都需要使用最新的签名方法
v4

实际上,我想创建一个预先签名的post url,将其与jquery fileupload结合使用。我已经用所有的访问密钥、bucket、CORS配置等正确地设置了S3,但是每次我都用下面的代码生成一个url

@signer = Aws::S3::Presigner.new
@url = @signer.presigned_url(:put_object, bucket: ENV['S3_BUCKET_NAME'], key: "documents/#{SecureRandom.uuid}/${filename}", acl: :public_read)
这将创建以下URL

https://project-xxxxx-staging.s3.eu-central-1.amazonaws.com/documents/a253feb0-4c60-4735-8d95-4649c0d3dcb5/%24%7Bfilename%7D?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAJVY57LY6XGIRIRHQ%2F20150205%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20150205T140425Z&X-Amz-Expires=900&X-Amz-SignedHeaders=host&x-amz-acl=public_read&X-Amz-Signature=ff2fbe233ed7380dc745aa7ba37421d7d8703db0d67208541e500367262a8c51
我得到以下错误

<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
有人知道如何解决这个问题,或者知道关于潜在问题的任何提示吗

我正在使用的环境:

ruby '2.2.0' 
gem 'rails', '4.2.0' 
gem 'aws-sdk', '~> 2.0.21.pre'

预签名URL包含根据将要/应该发送的标题和查询参数计算的签名。可能发生的情况是jquery上传程序正在添加amazons3需要签名的头(比如contenttype)。在生成预签名的url时,需要预先指定此内容类型:


signer=Aws::S3::Presigner.new
signer.presigned_url(:put_对象,bucket:'name',key:'key',acl:'public-read',content_类型:'…)

此外,正确的罐装ACL是“public read”,而不是
:public\u read
。这也可能会引起问题