【问题标题】:Amazon access key showing in URL for Carrierwave and Fog亚马逊访问密钥显示在 Carrierwave 和 Fog 的 URL 中
【发布时间】:2012-04-03 09:11:34
【问题描述】:

我刚刚从在本地存储通过 Carrierwave 上传的图像切换到通过我的 Rails 3.1 应用程序中的雾 gem 使用 Amazon s3。添加图像时,当我单击应用程序中的图像时,URL 提供了我的访问密钥和签名。这是一个示例 URL(XXX 将字符串替换为信息):

https://s3.amazonaws.com/bucketname/uploads/photo/image/2/IMG_4842.jpg?AWSAccessKeyId=XXX&Signature=XXX%3D&Expires=1332093418

这发生在开发 (localhost:3000) 和我使用 heroku 进行生产时。这是我的上传者:

class ImageUploader < CarrierWave::Uploader::Base
 include CarrierWave::RMagick
 storage :fog
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
  process :convert => :jpg
  process :resize_to_limit => [640, 640] 
  version :thumb do
    process :convert => :jpg
    process :resize_to_fill => [280, 205]
  end
  version :avatar do
    process :convert => :jpg
    process :resize_to_fill => [120, 120]
  end
end

还有我的 config/initializers/fog.rb :

 CarrierWave.configure do |config| 
  config.fog_credentials = { 
     :provider               => 'AWS', 
     :aws_access_key_id      => 'XXX', 
     :aws_secret_access_key  => 'XXX',
   } 
  config.fog_directory  = 'bucketname' 
  config.fog_public     = false
end  

有人知道如何确保这些信息不可用吗?

更新:添加视图和控制器代码: 来自 users/show.html.erb 中的部分内容:

<% if @user.photos.any? %>
  <% for photo in @user.photos %>
    <li class="span4 hidey">
    <div class="thumb_box">
      <%=link_to(image_tag(photo.image_url(:thumb).to_s), photo.image_url.to_s,   
                                                       :class=>"lb_test") %>
      ...
    </div>    
    </li>
  <% end %>
<% end %>

users_controller.rb:

 def show
   @user = User.find(params[:id])
 end

更新:添加从 url 中删除访问密钥信息时得到的错误页面:

This XML file does not appear to have any style information associated with it. The document tree is shown below.

<Error>
 <Code>AccessDenied</Code>
  <Message>Access Denied</Message>
   <RequestId>47077D6EC13AD1D8</RequestId>
     <HostId>+HTeODcWTqv3gbRIAwf+lI6sPzfNTegDXjT9SnMdqrYr7gLD1TD0qN+OgMLwA1JO
     </HostId>
 </Error>

【问题讨论】:

  • Kevin,我猜问题出在您的视图或控制器中。除非您需要另一个转换版本。可以发一下代码吗?
  • 嗨 Ed,我从其中一个视图和发生这种情况的控制器操作中添加了代码。谢谢。
  • 如果您在控制台中评估 photo.image.url.to_s 会发生什么?它是否指向真实图像?

标签: ruby-on-rails amazon-s3 carrierwave fog


【解决方案1】:

删除

config.fog_public     = false

这是一个非默认值:)

【讨论】:

    【解决方案2】:

    您看到的是一个签名网址。如果没有完整的 url(包括密钥、签名、过期),您将被拒绝访问。它完全按照应有的方式工作。而且我猜密钥只是一个公钥,没有你的私钥(AWS 有)就没用。

    【讨论】:

    • 啊,我明白了。您是正确的,访问密钥是我在上传程序中设置为“aws_access_key”的内容。将它包含在 URL 中似乎很奇怪。那么这些信息都不会让某人访问我的存储桶吗?
    • 不。并且签名使用过期时间和您的公钥进行哈希处理,如果没有您的密钥,就无法生成(或检查,如 AWS 所做的那样)。这很整洁。
    【解决方案3】:

    尝试使用 photo.image.url 而不是 photo.image_url。这就是我正在使用的。

    【讨论】:

    猜你喜欢
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多