2014-05-08 94 views
1

我正在开发一个AngularJS(前端)+ Rails API(后端)网站。我正在使用Amazon S3来存储图像。亚马逊S3 GET对象访问被拒绝

我能够使用aws sdk将图像从Rails上传到S3。我看到我S3中的图像变得更强大。但是,当我尝试从AngularJS视图中稍后获取它时,我的GET请求会收到Forbidden:Access拒绝错误。我想这个问题与桶或图像对象权限有关,但我无法弄清楚什么。

这是我怎么上传图片摘要:

AWS.config(
     :access_key_id => 'access-key', 
     :secret_access_key => 'secret-key', 
     :s3_endpoint => 's3-eu-west-1.amazonaws.com' 
    ) 
key = 'key_path_in_bucket' 

# Image is stored in S3 
     s3 = AWS::S3.new 
     puts "S3=" + s3.inspect 
     bucket = s3.buckets[bucketName]    
     obj = bucket.objects[key] 
     puts "obj=" + obj.inspect     
     obj.write(photo) 

注:我不在上传请求使用任何权限(当我检查在S3中的形象,我在属性看心不是任何权限设置)。

这是我斗政策:

{ 
    "Version": "2008-10-17", 
    "Id": "Policy1399551968880", 
    "Statement": [ 
     { 
      "Sid": "Stmt1399551891404", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "*" 
      }, 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::yanpy.dev/*" 
     }, 
     { 
      "Sid": "Stmt1399551962551", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "*" 
      }, 
      "Action": "s3:PutObject", 
      "Resource": "arn:aws:s3:::yanpy.dev/*" 
     } 
    ] 
} 

这是我的GET请求:

Remote Address:178.236.7.33:80 
    Request URL:http://yanpy.dev.s3.amazonaws.com/img/boats/6/52.jpg 
    Request Method:GET 
    Status Code:403 Forbidden 
    Request Headersview source 
    Accept:image/webp,*/*;q=0.8 
    Accept-Encoding:gzip,deflate,sdch 
    Accept-Language:en-US,en;q=0.8,es;q=0.6 
    Connection:keep-alive 
    Host:yanpy.dev.s3.amazonaws.com 
    Referer:http://localhost:1234/app/index.html 
    User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.132 Safari/537.36 
    Response Headersview source 
    Content-Type:application/xml 
    Date:Thu, 08 May 2014 15:04:42 GMT 
    Server:AmazonS3 
    Transfer-Encoding:chunked 
    x-amz-id-2:8QWnbecCc4nXd8+0zDxkqcECs+Sqkh8eBqq/FAWcy62mBRvK3VoCUbcBMywwCcyr 
    x-amz-request-id:A7D2E1F80F3F0612 

万一有帮助,当我在一个水桶手动创建一个对象,我也可以将其设置为公共(使用公共菜单)。但是,当我从aws sdk API上传图像时,我无法做到这一点(我得到以下对象因错误而未公开)。

+0

你想让图像公开可读吗? – Sebastian

+0

@塞巴斯蒂安我对安全性几乎一无所知。所以,任何帮助真的很受欢迎。我对你的问题的猜测实际上不是。我想我只是想公开图片来请求来自我的域名。是否有意义?我已经阅读过,您可以添加更多内容来实现此目的。但无论如何,我甚至无法将它们公诸于众。 – Rober

+0

@塞巴斯蒂安出现了我的想法。是否有可能检查谁是对象的用户或所有者?我有两个AWS账户,我有可能使用其他用户的凭证上传文件。在我的政策中,我授予了所有人的权利,对吧?它是有道理的,或者我会变得疯狂...... – Rober

回答

0

我终于修好了。

问题是我有两个不同的AWS账户。根据我的存储桶策略(以上)中的定义,迄今为止,我授予每个人的读写权限。所以,当我上传图像时,我使用第一个用户的密钥凭证。我能够上传。但是,我无法打开这些文件,因为我使用的是第二个用户的S3 AWS账户。

我刚更改了密钥凭据,一切正常。

1

确保你设置此策略,并尝试从浏览器访问你的形象:

{ 
    "Version": "2008-10-17", 
    "Statement": [ 
     { 
      "Sid": "AllowPublicRead", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "*" 
      }, 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::yanpy.dev/*" 
     } 
    ] 
} 

当这个作品设置此CORS配置和角度尝试:

<CORSConfiguration> 
    <CORSRule> 
     <AllowedOrigin>*</AllowedOrigin> 
     <AllowedMethod>GET</AllowedMethod> 
     <MaxAgeSeconds>3000</MaxAgeSeconds> 
     <AllowedHeader>Authorization</AllowedHeader> 
    </CORSRule> 
</CORSConfiguration> 
+0

对不起,我已将您的保单替换为您的保单,但保持原样。我无法打开任何使用aws sdk api从浏览器创建的对象:( – Rober

+0

谢谢@Sebastian,现在它的工作正常......节省我的时间。 –