相关疑难解决方法(0)

关于从iPhone应用程序和S3上传照片的架构和设计问题

我想允许iPhone应用程序的用户上传照片并使用Amazon S3.我有两种方法可以解决这个问题:

  1. 从iPhone上传到我的服务器,然后将其代理到Amazon S3.
  2. 从iPhone直接上传到S3

对于选项1,安全性很简单.我永远不必告诉iPhone我的S3秘密.缺点是所有内容都通过我们的服务器代理上传,这有点挫败了进入S3的目的.

对于选项2,理论上它更好,但问题是如何在不给我秘密的情况下将iPhone(或不同平台上的任何移动应用程序)写入我的S3存储桶?另外,我不确定这是否是一个好的设计,因为流程将是:iphone上传到S3,获取URL,然后告诉服务器URL是什么,以便它可以将它添加到我们的数据库以引用未来.但是,由于通信被分成两条腿(iphone-> S3 vs iPhone-> My-Server),因此它将其作为非原子操作而变得脆弱.

我发现了一些使用POST引用基于浏览器的上传的旧信息,但不确定这是否仍然是推荐的方法.我希望有一个更好的解决方案,我们可以使用REST API而不是依赖POST.我也看到了AWS iOS Beta SDK,但是他们的文档并没有多大帮助,我发现亚马逊的一篇文章同样无益,因为它会告诫你什么不该做,但没有告诉你另一种方法:

移动AWS开发工具包签署发送到Amazon Web Services(AWS)的API请求,以验证发出请求的AWS账户的身份.否则,恶意开发人员可以轻松地向其他开发人员的基础架构发出请求.请求使用AWS提供的AWS Access Key ID和Secret Access Key进行签名.秘密访问密钥类似于密码,保密是非常重要的.

提示:您可以在AWS网站http://aws.amazon.com/security-credentials上查看所有AWS安全凭证,包括访问密钥ID和秘密访问密钥 .

在源代码中嵌入凭证对于包括移动应用程序在内的软件来说是有问题的,因为恶意用户可以对软件进行解编译或查看源代码以检索秘密访问密钥.

有没有人对最佳建筑设计和流程有任何建议?

更新:我越深入研究,似乎有很多人建议使用HTTP POST方法和json策略文件,如下所述:http://docs.amazonwebservices.com/AmazonS3/2006-03-01/dev /index.html?UsingHTTPPOST.html.

有了这个,流程就像(1)iPhone向我的服务器发出请求,请求策略文件(2)服务器生成json策略文件并返回给客户端(3)iPhone将照片+ json策略的HTTP POST发送到S3 .我讨厌我以明显的kludgy方式使用HTTP POST,但它看起来更好,因为它根本不需要我的服务器来存储照片.

iphone mobile amazon-s3 ios4 ios

48
推荐指数
3
解决办法
8299
查看次数

如何使用Ruby aws/s3 Gem生成从s3下载文件的安全URL

我正在编写一个小脚本来在aws上的存储桶中找到特定文件,并创建一个临时验证的URL以发送给同事.(理想情况下,这会产生类似于右键单击控制台上的存储桶中的文件并复制链接地址的结果).

我已经研究过paperclip,它似乎不符合这个标准,但是我可能不知道它的全部功能.

我尝试了以下方法:

def authenticated_url(file_name, bucket)
  AWS::S3::S3Object.url_for(file_name, bucket, :secure => true, :expires => 20*60)
end
Run Code Online (Sandbox Code Playgroud)

产生了这种结果:

...- 1.amazonaws.com/file_path/file.zip.AWSAccessKeyId={key}Expires=1200&Signature = {...}

有没有办法创建一个更类似于上述场景的安全URL,可以简单地作为链接发送?如果没有,任何安全的替代品都会受到欢迎.

ruby url amazon-s3 amazon-web-services

5
推荐指数
1
解决办法
9581
查看次数

使用AFNetworking预先签名的S3 URL从iOS应用程序上传

我正在尝试将图像从我的iPhone应用程序上传到S3,然后将S3网址存储回我的rails应用程序.我不应该在iOS应用程序中嵌入凭据,所以我采取的方法是:

我尽力遵循我在网上找到的所有指示,但它不起作用,步骤3的结果返回错误401禁止.由于我是新手,我甚至不知道我做错了什么.

在第2步中,我的代码如下所示:

def getS3Url
  s3 = AWS::S3.new(
    :access_key_id => "MY S3 KEY",
    :secret_access_key => "MY SECRET ACCESS KEY"
  )
  object = s3.buckets[params["bucket"]].objects[params["path"]]
  @s3url = object.url_for(:write, { :expires => 20.minutes.from_now, :secure => true }).to_s
end
Run Code Online (Sandbox Code Playgroud)

从step2返回的url看起来像这样: https://s3.amazonaws.com/myapp-bucket-name/images/avatar/user1.png?AWSAccessKeyId=[access key id]&Expires=[expiration timestamp]&Signature=[Signature]

一旦我得到该URL,我尝试通过执行以下操作发布到它:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager POST:[responseObject valueForKey:@"s3url"] parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
  [formData appendPartWithFileData:jpegData name:@"file" fileName:self.filename mimeType:@"image/png"];
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
  NSLog(@"Success: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, …
Run Code Online (Sandbox Code Playgroud)

amazon-s3 amazon-web-services afnetworking afnetworking-2

1
推荐指数
1
解决办法
2956
查看次数