Как хранить данные в 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 для достижения такой настройки?


извиняюсь за несколько вопросов, и я ценю любое понимание проблемы. Спасибо :)

668   2  

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

    Ничего не найдено.