2014-06-26 18 views
1

你有任何使用FineUploader.com進行ruby簽名的s3服務器簽名示例嗎?我試圖在這許多變化:FineUploader在Ruby中籤名

if(@valid_data.headers.present?) 
    signature = OpenSSL::HMAC.digest(
      OpenSSL::Digest::Digest.new('sha1'), 
      S3_SECRET, 
      @valid_data.headers).gsub(/\n/, '') 
else 

signature = Base64.encode64(
    OpenSSL::HMAC.digest(
     OpenSSL::Digest::Digest.new('sha1'), 
     S3_SECRET, 
     Base64.encode64(@valid_data.headers) 
    ) 
).gsub(/\n/, '') 

    details.policy = Base64.encode64({ expiration: @valid_data.expiration, 
            conditions: @valid_data.conditions 
           }.to_json 
          ).gsub(/\n|\r/, '') 
end 

details.signature = signature 

render :json => details, :status => 200 and return 

但不能讓我做匹配標誌亞馬遜給出的跡象,因此我得到每次上傳我

我查了GitHub庫,軌道錯誤s3幫助只指向https://github.com/Widen/fine-uploader-server/blob/master/rails.md,它指向https://github.com/Widen/fine-uploader-server/wiki/Rails---CarrierWave,它似乎沒有任何連接到FineUploader。 最佳, 溫尼

編輯(澄清)

爲5MB文件,簽署了頭PARAMS與代碼工作正常,從http://aws.amazon.com/articles/1434/#signyours3postform

signature = Base64.encode64(
    OpenSSL::HMAC.digest(
     OpenSSL::Digest::Digest.new('sha1'), 
     S3_SECRET, @valid_data.headers) 
    ).gsub("\n","") 

對於亞5MB的文件,它需要一個政策,一個簽名 FineUploader給我一個「條件」參數,我用它來獲得所有需要的信息:

conds = [ 
     {"acl" => "private"}, 
     {"bucket" => conditions[1][:bucket]}, 
     {"Content-Type" => conditions[2]["Content-Type"]}, 
     {"success_action_status" => "200"}, 
     {"key" => conditions[4][:key]}, 
     {"x-amz-meta-qqfilename" => conditions[5]["x-amz-meta-qqfilename"]}, 
     {"content-length-range" => [content_length_range[1], content_length_range[2]]} 
    ] 

    policy = Base64.encode64({ "expiration" => @valid_data.expiration.to_s, 
             "conditions" => conds 
            }.to_json). 
          gsub("\n","") 

    signature = Base64.encode64(
    OpenSSL::HMAC.digest(
     OpenSSL::Digest::Digest.new('sha1'), 
     S3_SECRET, policy) 
    ).gsub("\n","") 

在AWS 100%升級到aws後,AWS始終以「無效策略:無效簡單條件:值mu ..」作爲響應。我也不能似乎找到內https://github.com/aws/aws-sdk-ruby

而且政策簽字功能,根據紅寶石AWS-SDK(https://github.com/aws/aws-sdk-ruby/blob/master/lib%2Faws%2Fcore%2Fsigners%2Fbase.rb),紅寶石使用SHA256,而不是SHA1

+0

當我停下來傳遞內容長度範圍爲conds,簽名按預期工作。關閉 –

回答

2

你的問題不是很清楚,我,但如果你是試圖直接上傳文件到S3,您可以用這種方式簽署請求(取自s3_direct_upload寶石)。我在我的應用程序中使用這個gem直接上傳文件到S3

 
    def policy 
     Base64.encode64(policy_data.to_json).gsub("\n", "") 
    end 

    def policy_data 
     { 
     expiration: @options[:expiration], 
     conditions: [ 
      ["starts-with", "$utf8", ""], 
      ["starts-with", "$key", @options[:key_starts_with]], 
      ["starts-with", "$x-requested-with", ""], 
      ["content-length-range", 0, @options[:max_file_size]], 
      ["starts-with","$content-type", @options[:content_type_starts_with] ||""], 
      {bucket: @options[:bucket]}, 
      {acl: @options[:acl]}, 
      {success_action_status: "201"} 
     ] + (@options[:conditions] || []) 
     } 
    end 

    def signature 
     Base64.encode64(
     OpenSSL::HMAC.digest(
      OpenSSL::Digest.new('sha1'), 
      @options[:aws_secret_access_key], policy 
     ) 
    ).gsub("\n", "") 
    end 

你可以看到完整的代碼在這裏:https://github.com/waynehoover/s3_direct_upload/blob/master/lib/s3_direct_upload/form_helper.rb

+0

我的問題涉及s3上傳工具,fineuploader:http://docs.fineuploader.com/endpoint_handlers/amazon-s3.html大多數其他語言都存在簽名示例,但我不明白導軌示例,按照https: //github.com/Widen/fine-uploader-server –

+1

正如Fine Uploader S3文檔中所鏈接的,這裏有幾種語言的示例,包括Ruby:http://aws.amazon.com/articles/1434/#signyours3post –

+0

@ user1741832,我認爲你的問題是你在創建'policy'之前創建'簽名'。首先創建'策略',因爲它用於創建'簽名'。看到上面的代碼,你會看到我在說什麼。 – San

1

當我停下來傳遞內容長度範圍爲conds,簽名和預期一樣