我是编写 Rails 和 API 的新手。我需要一些有关 S3 存储解决方案的帮助。这是我的问题。
我正在为 iOS 应用程序编写一个 API,用户在 iOS 上使用 Facebook API 登录。服务器根据 Facebook 向 iOS 用户颁发的令牌验证用户,并颁发临时会话令牌。从此时起,用户需要下载存储在 S3 中的内容。该内容仅属于该用户及其一部分朋友。该用户可以向 S3 添加更多内容,可供同一群人访问。我想这类似于将文件附加到 Facebook 群组......
用户可以通过两种方式与 S3 交互...将其留给服务器或让服务器颁发临时 S3 令牌(不确定此处的可能性),并且用户可以直接访问 S3 的内容 URL。我发现这个问题谈论的是方法,但是,它确实已经过时了(两年前):关于从 iPhone 应用程序和 S3 上传照片的架构和设计问题 https://stackoverflow.com/questions/4481311/architectural-and-design-question-about-uploading-photos-from-iphone-app-and-s3
所以问题是:
- 颁发临时令牌时,是否有办法限制用户只能访问 S3 上的某些内容?我怎样才能做到这一点?假设有...比如说 100,000 或更多用户。
- 让iOS设备直接拉出这些内容是不是一个好主意?
- 或者应该让服务器控制所有内容传递(这当然解决了安全性)?这是否意味着我必须先将所有内容下载到服务器,然后再将其传递给连接的用户?
- 如果您了解 Rails...我可以使用回形针和 aws-sdk gems 来实现这种设置吗?
对多个问题表示歉意,并且感谢您对这个问题的深入了解。谢谢 :)
使用AWS-SDK 宝石 https://github.com/aws/aws-sdk-ruby,您可以通过调用获取任何 S3 对象的临时签名 urlurl_for https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/S3Object.html#url_for-instance_method:
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。
或者应该让服务器控制所有内容传递(这当然解决了安全性)?这是否意味着我必须先将所有内容下载到服务器,然后再将其传递给连接的用户?
请注意,这并不意味着服务器需要下载每个对象,它只需要验证并授权特定客户端访问 S3 中的特定对象。
来自亚马逊的 API 文档:https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html#RESTAuthenticationQueryStringAuth https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html#RESTAuthenticationQueryStringAuth
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)