使用 Fog AWS S3 & Rails 时获得负到期

Getting Negative Expiry when Using Fog AWS S3 & Rails

我正在尝试使用 Fog 为 S3 中的文件生成签名的 url;然而,get 返回的 url 总是 returns 负到期,导致 url 变为 400

connection = Fog::Storage.new(
  region: 'us-west-1',
  provider: 'AWS',
  aws_access_key_id: ENV['AWS_ACCESS_KEY'],
  aws_secret_access_key: ENV['AWS_SECRET_KEY']
)
bucket = connection.directories.get(BUCKET)
file = 'test.jpg'
p file_url = bucket.files.get_https_url("uploads/#{file}", 300)

生成URL:

https://account.s3-us-west-x.amazonaws.com/files/test.doc?X-Amz-Expires=-1443648781&X-Amz-Date=20150930T213801Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AAAVA***FA/20150930/us-west-x/s3/aws4_request&X
-Amz-SignedHeaders=host&X-Amz-Signature=e31663f9b2470e***215825d585b14c37e

我是不是漏掉了什么?为什么生成的 url 给我负过期时间 (X-Amz-Expires)?

expires 参数似乎需要 unix 纪元时间的绝对过期时间...而不是从现在开始的秒数。

如果为真,则“300”将是“1970-01-01 00:05:00 UTC”的过期时间,我猜这是过去 1443648781 秒,当时您生成签名 URL.

您生成的签名是 AWS Signature V4,在 URL 本身中,过期时间将从现在开始以秒为单位显示...但是旧的 AWS Signature V2 需要绝对纪元时间,因此基于遗留行为,如果库仍然期望纪元时间作为参数而不管使用的签名版本如何......并且在构建 url 时做了减法......但它似乎图书馆盲目接受这样一个明显无效的值有点愚蠢。

未来的搜索者:

# url that expires in 5 minutes
p file_url = bucket.files.get_https_url("uploads/#{file}", Time.now + (5 * 60))