Получение отрицательного срока действия при использовании Fog AWS S3 и Rails

Я пытаюсь сгенерировать подписанный URL-адрес для файла в S3, используя Fog; однако возвращаемый URL-адрес всегда возвращает отрицательный срок действия, что приводит к тому, что 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)?


person doremi    schedule 01.10.2015    source источник
comment
правильно ли настроено время в вашей системе?   -  person CuriousMind    schedule 01.10.2015


Ответы (2)


Аргумент expires, по-видимому, ожидает абсолютного времени истечения срока действия в эпоху unix... а не количества секунд с этого момента.

Если это правда, то «300» будет временем истечения «1970-01-01 00:05:00 UTC», что, как я предполагаю, было 1443648781 секунд в прошлом, когда вы создали этот подписанный URL-адрес.

Подпись, которую вы создаете, — это AWS Signature V4, и в самом URL-адресе время истечения срока действия будет отображаться в секундах с этого момента... но старая подпись AWS V2 ожидала абсолютное время эпохи, поэтому, основываясь на устаревшем поведении, она имело бы смысл, если бы библиотека по-прежнему ожидала время эпохи в качестве аргумента независимо от используемой версии подписи... и делала вычитание при построении URL-адреса... но кажется немного глупым, что такое явно недопустимое значение принимается вслепую библиотекой.

person Michael - sqlbot    schedule 02.10.2015
comment
Это также нигде не документировано. Ближайшее место находится здесь: github.com/fog/fog-aws/blob/master/lib/fog/aws/requests/storage/ - person doremi; 02.10.2015
comment
Также это: github.com/fog /fog-aws/blob/ - person Nigel Sheridan-Smith; 03.05.2016
comment
Вы можете применить параметр {aws_signature_version: 2}, чтобы принудительно использовать AWS::Storage или Fog::Storage для более старой версии 2. - person Nigel Sheridan-Smith; 04.05.2016

Будущие искатели:

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