Как хранить данные в S3 и разрешать доступ пользователей безопасным способом с помощью rails API / iOS client?
Я новичок в написании Rails и API. Мне нужна помощь с решением для хранения S3. Вот в чем моя проблема.
Я пишу API для приложения iOS, где пользователи входят в систему с помощью API Facebook на iOS. Сервер проверяет пользователя на наличие маркера проблемы Facebook для пользователя iOS и выдает временный маркер сеанса. С этого момента пользователю необходимо загрузить содержимое, которое хранится в S3. Этот контент принадлежит только пользователю и подмножеству его друзей. Этот пользователь может добавить больше контент для S3, к которому может получить доступ одна и та же группа людей. Я думаю, это похоже на прикрепление файла к группе в Facebook...
есть 2 способа, которыми пользователь может взаимодействовать с S3... оставьте его на сервере или попросите сервер выдать временный маркер S3 (не уверен в возможностях здесь), и пользователь может попасть на URL-адреса контента непосредственно в S3. Я нашел этот вопрос, говорящий о подходах, однако, он действительно датирован (2 года назад): архитектурный и дизайнерский вопрос о загрузка фотографий из приложения iPhone и S3
поэтому вопросы:
- есть ли способ ограничить доступ пользователя только к некоторому контенту на S3, когда выдается временный маркер? Как я могу это сделать? Предположим, что есть... скажем, 100 000 или более пользователей.
- это хорошая идея, чтобы устройство iOS вытащить этот контент напрямую?
- или пусть сервер контролирует всю передачу контента (это решает безопасность, конечно)? Означает ли это, что я должен загрузить все содержимое на сервер перед передачей его подключенным пользователям?
- если вы знаете рельсов... могу ли я использовать paperclip и AWS-sdk gems для достижения такой настройки?
извиняюсь за несколько вопросов, и я ценю любое понимание проблемы. Спасибо :)
2 ответов:
С помощью aws-sdk gem, вы можете получить временный подписанный url для любого объекта S3, вызвав
url_for:s3 = AWS::S3.new( :access_key_id => 1234, :secret_access_key => abcd ) object = s3.buckets['bucket'].objects['path/to/object'] object.url_for(:get, { :expires => 20.minutes.from_now, :secure => true }).to_sэто даст вам подписанный URL-адрес временного использования только для этого объекта в S3. Он истекает через 20 минут (в этом примере), и это хорошо только для этого одного объекта.
Если у вас есть много объектов, которые нужны клиенту, вам нужно будет выпустить много подписанных URL-адресов.
или пусть сервер контролирует все передача контента (это решает безопасность, конечно)? Означает ли это, что я должен загрузить весь контент на сервер, прежде чем передавать его подключенным пользователям?
API docs от Amazon: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html#RESTAuthenticationQueryStringAuth
в приведенных выше ответах используется старый AWS-sdk-v1 gem, а не новая версия aws-sdk-resources 2.
новый путь:
aws_resource = Aws::S3::Resource::new aws_resource.bucket('your_bucket').object('your_object_key').presigned_url(:get, expires_in: 1*20.minutes)где your_object_key-это путь к вашему файлу. Если вам нужно посмотреть, что вверх, вы бы использовали что-то вроде:
s3 = Aws::S3::Client::new keys = [] s3.list_objects(bucket: 'your_bucket', prefix: 'your_path').contents.each { |e| keys << e.key }эта информация была поразительно трудно выкопать, и я чуть не сдался и использовал старые драгоценный камень.
ссылка
http://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Object.html#presigned_url-instance_method
Comments