Ответ 1
На самом деле я только что применил авторизированный URL-адрес S3 в моем приложении Ruby on Rails 3 с скрепкой. Позвольте мне рассказать, как я это сделал.
Так что я сделал, и то, что вы, вероятно, хотите, довольно легко реализовать. Позвольте мне привести вам пример:
Модель FileObject
has_attached_file :attachment,
:path => "files/:id/:basename.:extension",
:storage => :s3,
:s3_permissions => :private,
:s3_credentials => File.join(Rails.root, 'config', 's3.yml')
Контроллер FileObjectsController
def download
@file_object = FileObject.find(params[:id])
redirect_to(@file_object.attachment.expiring_url(10))
end
Я считаю, что это довольно просто. Вы добавляете приложение Paperclip к модели FileObject, а затем выполняете действие (скачать) в FileObjectsController. Таким образом, вы можете сделать некоторую авторизацию на уровне приложения внутри вашего контроллера с помощью before_filter или чего-то еще.
Метод expying_url() (предоставленный Скрепкой) в @file_object.attachment в основном запрашивает Amazon S3 для ключа, который делает доступный с этим конкретным ключом. Первый аргумент метода expying_url() принимает целое число, которое представляет количество секунд, в котором вы хотите, чтобы предоставленный URL-адрес истекал.
В моем приложении в настоящее время установлено значение 10 (@file_object.attachment.expiring_url (10)), поэтому, когда пользователь запрашивает файл, пользователь ВСЕГДА должен выполните мое приложение, например, myapp.com/file_objects/3/download, чтобы получить новый действительный URL-адрес от Amazon, который пользователь мгновенно будет использовать для загрузки файла, так как мы используем redirect_to в действии скачать. Таким образом, в основном через 10 секунд после того, как пользователь нажимает на действие скачать, ссылка уже истекла, и пользователь (или все еще) счастливо загружает этот файл, хотя он остается защищенным от любых несанкционированных пользователей.
Я даже пытался установить expiring_url (1), чтобы URL-адрес моментально истекал после того, как пользователь запускает запрос Amazon S3 для URL-адреса. Это работало для меня локально, но никогда не использовало его в производстве, вы тоже можете попробовать это. Однако я установил его на 10 секунд, чтобы дать серверу короткий промежуток времени для ответа. Отлично работает до сих пор, и я сомневаюсь, что кто-то убьет кого-то URL в течение 10 секунд после его создания, не говоря уже о том, что такое URL.
Дополнительная мера безопасности, которую я взяла, - это просто создать секретный ключ для каждого создаваемого файла, чтобы мой URL всегда выглядел следующим образом:
has_attached_file :attachment,
:path => "files/:id/:secret_key/:basename.:extension"
Таким образом, каждый URL имеет уникальную secret_key в своем пути, что усложняет захват за время доступа к URL. Имейте в виду, что, пока URL-адрес вашего файла остается неизменным, доступность обеспечивается дополнительными параметрами, которые предоставляет Amazon S3, срок действия которых истекает:
http://s3.amazonaws.com/mybucket/files/f5039a57acc187b36c2d/my_file.pdf?AWSAccessKeyId=AKIAIPPJ2IPWN5U3O1OA&Expires=1288526454&Signature=5i4%2B99rUwhpP2SbNsJKhT/nSzsQ%3D
Обратите внимание на эту часть, которая является ключом Amazon, который генерирует и истекает, что делает файл временно доступным:
my_file.pdf?AWSAccessKeyId=AKIAIPPJ2IPWN5U3O1OA&Expires=1288526454&Signature=5i4%2B99rUwhpP2SbNsJKhT/nSzsQ%3D
Вот и все. И это изменяется с каждым запросом вашего файла, если требуется, с помощью действия скачать.
Надеюсь, это поможет!