ruby-on-rails - 如何在S3中存储数据并允许用户使用rails API/iOS客户端以安全的方式访问?

标签 ruby-on-rails api amazon-s3 amazon-ec2 client-server

我是编写 Rails 和 API 的新手。我需要一些有关 S3 存储解决方案的帮助。这是我的问题。

我正在为 iOS 应用程序编写一个 API,用户在 iOS 上使用 Facebook API 登录。服务器根据 Facebook 向 iOS 用户颁发的 token 验证用户,并颁发临时 session token 。从此时起,用户需要下载存储在 S3 中的内容。该内容仅属于该用户及其一部分 friend 。该用户可以向 S3 添加更多内容,可供同一群人访问。我想这类似于将文件附加到 Facebook 群组...

用户可以通过两种方式与 S3 交互...将其留给服务器或让服务器颁发临时 S3 token (不确定此处的可能性),并且用户可以直接访问内容 URL到S3。我发现这个问题谈论的是方法,但是,它确实已经过时了(2年前):Architectural and design question about uploading photos from iPhone app and S3

所以问题是:

  • 在颁发临时 token 时,是否有办法限制用户只能访问 S3 上的某些内容?我怎样才能做到这一点?假设有……100,000 或更多用户。
  • 让 iOS 设备直接拉出此内容是个好主意吗?
  • 或者应该让服务器控制所有内容传递(这当然解决了安全问题)?这是否意味着我必须先将所有内容下载到服务器,然后再将其传递给连接的用户?
  • 如果您了解 Rails...我可以使用回形针和 aws-sdk gems 来实现这种设置吗?

对于多个问题,我深表歉意,并且感谢您对这个问题的深入了解。谢谢:)

最佳答案

使用aws-sdk gem ,您可以通过调用 url_for 获取任何 S3 对象的临时签名 url :

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。

Or should let the server control all content passing (this solves security of course)? Does this mean I have to download all content to server before handing it down to the connected users?

请注意,这并不意味着服务器需要下载每个对象,它只需要验证并授权特定客户端访问 S3 中的特定对象。

来自亚马逊的 API 文档: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html#RESTAuthenticationQueryStringAuth

关于ruby-on-rails - 如何在S3中存储数据并允许用户使用rails API/iOS客户端以安全的方式访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10811017/

相关文章:

api - 从 Visual Studio Online API 中提取燃尽图

api - 如何获取 Expedia Affiliate Network 的 CID(客户 ID)?

ruby-on-rails - AWS::S3::Errors::InvalidArgument 与 Paperclip PDF 上传

linux - 尝试将 S3 存储桶装入 Ubuntu 14.04 EC2 实例时出错

ruby-on-rails - 用户启动Passenger(使用Nginx)

ruby-on-rails - vcr 从多个 Web 请求中断

django - 我可以在同一个 url 模式中包含两个不同的 url 吗?示例 [ 路径 ('api/' ,包括 ('quiz.urls' )),路径 ('api/' ,包括 ('user.urls' )) ]

python - 使用lambda python将文件上传到s3后用表单数据更新mysql

ruby-on-rails - 如何共享 GEM 中的工厂并将其用于其他项目?

javascript - rails 4 : changing link style upon Ajax call