我不熟悉编写Rails和API.我需要一些关于S3存储解决方案的帮助.这是我的问题.

我正在为iOS应用程序编写一个API,用户可以在iOS上使用Facebook API登录.服务器根据Facebook向iOS用户发出的令牌验证用户,并发出临时会话令牌.从这一点开始,用户需要下载存储在S3中的内容.此内容仅属于用户及其朋友的一部分.这个用户可以向S3添加更多内容,这些内容可以被同一群人访问.我猜这类似于将文件附加到Facebook群组...

用户可以通过两种方式与S3交互...把它留给服务器,或者让服务器发布一个临时的S3令牌(这里不确定是否有可能),用户可以直接访问S3的内容URL.我发现这个问题是关于方法的,然而,它确实是过时的(2年前):Architectural and design question about uploading photos from iPhone app and S3

所以问题是:

  • 当发布临时令牌时,是否有方法限制用户仅访问S3上的某些内容?我该怎么做?假设有...比如说10万或更多的用户.
  • 让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

这将为S3中的对象提供一个已签名的临时使用URL.它将在20分钟后过期(在本例中),并且只适用于该对象.

如果你有很多客户端需要的对象,你需要发布很多签名的URL.

还是应该让服务器控制所有传递的内容(这当然解决了安全问题)?这是否意味着我必须先将所有内容下载到服务器,然后再将其交给连接的用户?

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

来自亚马逊的API文档:

Ruby-on-rails相关问答推荐

通过激励控制器正确更新Turbo帧信源

如何将POST-CSSS-IMPORT与TRANWIND-RACKS和IMPORT映射一起使用

DateTime的最小数据提交格式

在Rails中,如何将帮助器方法添加到属性/列?

SASS,Rails 7:找不到要导入的样式表

Rails:当 id 方法为非标准时构建关联

插件和 Ruby gem 之间的区别?

如何在我的 rails 应用程序中测试 ActiveRecord::RecordNotFound?

在 Nokogiri 中获取属性值以提取链接 URL

Rails 模型:您将如何创建一组预定义的属性?

如何在 Windows 上为 Ruby 安装 sqlite3?

将根 url 重定向到 Rails 应用程序中的其他位置

Rails - 如何在 f.submit 上放置确认弹出窗口?

如何拯救 OmniAuth::Strategies::OAuth2::CallbackError?

Rails HABTM - 正确删除关联

# 轨道中的 TODO

资源和资源方法之间的区别

Rails:在 link_to 中保留 GET 查询字符串参数

如何为 Rails 控制器添加延迟以进行测试?

没有UTC的Rails 3默认日期时间格式