【发布时间】:2014-05-09 03:34:41
【问题描述】:
我正在开发一个 AngularJS(前端)+ Rails API(后端)网站。我使用 Amazon S3 存储图像。
我能够使用 aws sdk 将图像从 Rails 上传到 S3。我看到我的 S3 中的图像被破坏了。但是,当我稍后尝试从 AngularJS 视图中获取它时,我的 GET 请求会收到 Forbidden: Access denied 错误。我猜这个问题与存储桶或图像对象权限有关,但我不知道是什么。
这是我如何上传图片的总结:
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
以防万一,当我在存储桶中手动创建对象时,我还可以将其设置为公共(使用 make public 菜单)。但是,当我从 aws sdk API 上传图像时,我不能这样做(我得到以下对象由于错误而没有公开)。
【问题讨论】:
-
你想让图片公开可读吗?
-
@Sebastian 我对安全几乎一无所知。因此,非常欢迎任何帮助。我对你的问题的猜测实际上不是。我想我只是想让图像公开以请求来自我的域。是否有意义?我已阅读您可以在政策中添加更多内容以实现此目的。但无论如何,我什至无法将它们公开给所有人。
-
@Sebastian 我想到了一些东西。是否可以检查谁是对象的用户或所有者?我有两个 AWS 账户,我可能使用其他用户的凭证上传了文件。在我的政策中,我授予每个人访问权限,对吗?这有意义还是我疯了......
-
它的工作!我真的为我的错误道歉。我会在下面解释。
标签: ruby-on-rails angularjs amazon-web-services amazon-s3