S3“根据政策无效:政策已过期”

时间:2013-10-21 22:54:35

标签: jquery ruby-on-rails amazon-s3

我最近刚尝试在本地上传图片时遇到此错误。我不习惯得到错误。 S3方面或代码方面没有任何变化。上传仍然可以在生产中使用。我已经尝试了所有通常的,重新启动服务器,重新启动计算机,更改到不同的浏览器,清除缓存/ cookie,更改策略中的到期,检查我的ENV变量是否存在并且是正确的....

这是我使用jQuery Fileupload的coffescript

$("input.fileupload").fileupload
  url: '<%= s3_bucket_url %>'
  type: 'POST'
  autoUpload: true
  dataType: 'xml'
  paramName: 'file'
  acceptFileTypes: /(\.|\/)(jpg|png)$/i
  formData:
    key: '<%= "tmp-uploads/#{SecureRandom.uuid}/${filename}" %>'
    AWSAccessKeyId: '<%= Settings.fog.aws_access_key_id %>'
    acl: 'public-read'
    policy: '<%= s3_policy %>'
    signature: '<%= s3_signature %>'
    success_action_status: '201'
  success: (data)->
    # success stuff
  fail: (e, data)->
    # fail stuff

这是我的S3助手

module S3Helper

  def s3_bucket_url
    "https://#{Settings.fog.directory}.s3.amazonaws.com"
  end

  def s3_signature
    Base64.encode64(
      OpenSSL::HMAC.digest(
        OpenSSL::Digest::Digest.new('sha1'), 
        Settings.fog.aws_secret_access_key,
        s3_policy
      )
    ).gsub(/\n/, '')
  end

  def s3_policy
    Base64.encode64(
      {
        expiration: 24.hours.from_now.utc.strftime('%Y-%m-%dT%H:%M:%SZ'),
        conditions: [
          { bucket: Settings.fog.directory },
          { acl: 'public-read' },
          ['starts-with', '$key', 'tmp-uploads/'],
          { success_action_status: '201' }
        ]
      }.to_json
    ).gsub(/\n|\r/, '')
  end
end

我的想法已经不多了。我需要添加“内容类型”吗?任何方向都会非常感激。

2 个答案:

答案 0 :(得分:3)

如果是这样,你的代码没有任何改变,我的猜测是:

  

Why do some of my requests randomly fail with a 403 Forbidden?

     

检查有问题的系统时钟和时区设置   机。 Amazon S3要求所有发出请求的计算机都在15以内   亚马逊S3网络服务器时钟的分钟数。设置您的机器   除了确定它们之外,还要将它们的时间与NTP服务器同步   为最近的节日修补应该解决的补丁   这个问题。

     

当开发人员决定部署他们时,这是一个常见错误   申请到另一台机器。

     

Amazon S3的响应将包含以下内容:

     
      
  • HTTP状态代码:403 Forbidden
  •   
  • 错误代码:RequestTimeToo-Skewed
  •   
  • 说明:请求时间与服务器时间之间的差异太大。
  •   

您必须正确设置时区,不能简单地向上或向下调整一小时。

答案 1 :(得分:0)

这可能是由于&#34;时间漂移造成的,这意味着服务器和客户端需要时间同步。如果任何一个漂移太多,您将看到策略过期错误。

Re:服务器,请注意,如果您现在在本地开发,那么您的服务器很可能在某种虚拟机中运行,无论是由Vagrant管理的VM,还是docker-machine。这意味着此实例中的服务器是来宾虚拟机,其内部时间需要正确,主机本身的时间也无关紧要。

如果您使用的是docker-machine,则可以通过执行以下操作进入实例:

docker-machine ssh name-of-machine

然后(假设* nix):

date检查日期&amp; sudo ntpd -q -p pool.ntp.org更新它。