0

CarrierwaveをS3で動作させようとしていますが、署名が一致しないというエラーが発生します。奇妙なことに、carrierwaveが正しい秘密鍵を送信しているようには見えません。エラーでは、投稿は次のように表示されます。

"Authorization"=>"AWS AKIAIOLWQKSJFH6E3I5Q:vKgyAw2z4c8zzqGWoxLUbw7I5oI="

私が想定しているのは、私のpublickey:privatekeyであると思われます。問題は、vKgyAw2z4c8zzqGWoxLUbw7I5oI=がfog.rbに保存した秘密鍵ではないということです。そうですか?

どんな助けでも大歓迎です。

要求/応答:

 request => {:chunk_size=>1048576, :connect_timeout=>60, :headers=>{"Content-Length"=>1557, "Content-Type"=>"image/
gif", "x-amz-acl"=>"public-read", "Date"=>"Wed, 24 Oct 2012 12:45:17 +0000", "Authorization"=>"AWS AKIAIOLWQKSJFH6E3
I5Q:vKgyAw2z4c8zzqGWoxLUbw7I5oI=", "Host"=>"s3.amazonaws.com:443"}, :instrumentor_name=>"excon", :mock=>false, :nonb
lock=>true, :read_timeout=>60, :retry_limit=>4, :ssl_ca_file=>"/home/tim/.rvm/gems/ruby-1.9.3-p194/gems/excon-0.16.5
/data/cacert.pem", :ssl_verify_peer=>true, :write_timeout=>60, :host=>"myeasybnb.s3.amazonaws.com", :host_port=>"s3.
amazonaws.com:443", :path=>"/images%2Fb1bb6639-dc08-4981-9a9b-7175093ac970.gif", :port=>"443", :query=>nil, :scheme=
>"https", :body=>#<File:/home/tim/Dropbox/myeasybnb/tmp/uploads/20121024-0845-20225-1170/240x240.gif>, :expects=>200
, :idempotent=>true, :method=>"PUT"}
  response => #<Excon::Response:0xa7a1098 @body="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>SignatureD
oesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your
 key and signing method.</Message>

fog.rb:

CarrierWave.configure do |config|
  config.fog_credentials = {
    :provider               => 'AWS',       # required
    :aws_access_key_id      => 'AKIAIOLWQKSJFH6E3I5Q',       # required
    :aws_secret_access_key  => '[my secret key]'      # required

  }
  config.fog_directory  = 'myeasybnb'                             # required
  config.fog_public     = true                                   # optional, defaults to true

end

Uploader.rb:

# encoding: utf-8

class PhotoUploader < CarrierWave::Uploader::Base


  # Include RMagick or MiniMagick support:
  # include CarrierWave::RMagick
  include CarrierWave::MiniMagick

  # Include the Sprockets helpers for Rails 3.1+ asset pipeline compatibility:
   include Sprockets::Helpers::RailsHelper
   include Sprockets::Helpers::IsolatedHelper

  # Choose what kind of storage to use for this uploader:
  # storage :file
   storage :fog

  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
    "images"
  end

  # Provide a default URL as a default if there hasn't been a file uploaded:
class MyUploader < CarrierWave::Uploader::Base
  def default_url 
     asset_path("seeds/" + [version_name, "default.png"].compact.join('_'))
  end
end

  # Process files as they are uploaded:
  # process :scale => [200, 300]
  #


  # Create different versions of your uploaded files:

  process :convert => 'jpg'
  version :sidecarousel, :if => :is_side_carousel? do
      process :resize_to_fit => [2000,1000]
  end
    version :thumbnail, :if => :is_thumbnail? do
       process :resize_to_fill => [240,240]        
    end

    version :linetext, :if => :is_line? do
         process :resize_to_fill => [400,200]
    end
    version :carousel, :if => :is_carousel? do
      process :resize_to_fit => [2200, 1000]
    end  

    version :phone do
      process :resize_to_fit => [900,900]
    end
  # def scale(width, height)
  #   # do something
  # end




  def is_side_carousel? photo
    model.location == 1
  end

  def is_thumbnail? photo
  model.location == 2
  end
  def is_line? photo
    model.location == 3
  end
  def is_carousel? photo
    model.location == 4
  end

  # Add a white list of extensions which are allowed to be uploaded.
  # For images you might use something like this:
  def extension_white_list
    %w(jpg jpeg gif png)
  end



  # Override the filename of the uploaded files:
  # Avoid using model.id or version_name here, see uploader/store.rb for details.
 def filename
    file.nil? ?  @filename = nil : @filename = "#{secure_token}.#{file.extension}" 


 end 

    def secure_token
    var = :"@#{mounted_as}_secure_token"
    model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.uuid)
  end
  def cache_dir
"#{Rails.root}/tmp/uploads"
end

end
4

1 に答える 1

0

私はなんとかこれを修正することができました。自分が何をしたのか正確にはわかりませんが、いくつか問題がありました。(1)アップローダーでフォルダーを指定していたため、認証エラーが発生したと思います。ここで、アップローダーのディレクトリを「」に設定し、フォグ構成でフォルダーを指定します。

(2)私が得ていたもう1つのエラーは、時間の不一致でした。私は開発用の仮想マシンでミントを実行しましたが、時間は現実とは異なりました。アマゾンはそれでエラーを投げました。正しい時刻を設定すると、それはなくなりました。

于 2012-10-25T17:40:16.510 に答える