3

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

这是我使用 jQuery Fileupload 的咖啡脚本

$("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

我的想法不多了。我需要添加“内容类型”吗?任何方向将不胜感激。

4

2 回答 2

4

如果如您所说,并且您的代码没有任何改变,我的猜测是:

为什么我的一些请求随机失败并出现 403 Forbidden?

检查违规机器上的系统时钟和时区设置。Amazon S3 要求所有发出请求的机器都在 Amazon S3 网络服务器时钟的 15 分钟内。将您的机器设置为与 NTP 服务器同步时间,并确保它们已针对最近的夏令时更改进行了修补,应该可以解决此问题。

当开发人员决定将他们的应用程序部署到另一台机器时,这是一个常见错误。

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

  • HTTP 状态码:403 禁止
  • 错误代码:RequestTimeToo-Skewed
  • 说明:请求时间与服务端时间相差过大。

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

于 2013-10-21T23:50:13.790 回答
0

这可能是由于“时间漂移”引起的,这意味着服务器和客户端需要在时间上同步。如果任一偏差太大,您将看到 Policy expired 错误。

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

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

docker-machine ssh name-of-machine

然后(假设 *nix):

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

于 2015-07-29T11:07:13.580 回答