【问题标题】:Amazon S3 GET object Access DeniedAmazon S3 GET 对象访问被拒绝
【发布时间】: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


【解决方案1】:

确保您设置了此政策并尝试从浏览器访问您的图片:

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

当这个工作设置这个 CORS 配置并从 Angular 尝试:

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

【讨论】:

  • 抱歉,我已将我的保单替换为您的保单,但还是一样。我无法从浏览器打开使用 aws sdk api 创建的任何对象:(
  • 谢谢@Sebastian,现在它工作正常...节省我的时间。
【解决方案2】:

我终于修好了。

问题是我有两个不同的 AWS 账户。正如我的存储桶策略(上图)中所定义的那样,到目前为止,我授予每个人读写访问权限。因此,当我上传图片时,我使用的是第一个用户的密钥凭据。我能够上传。但是,我无法打开文件,因为我使用的是第二个用户的 S3 AWS 帐户。

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

【讨论】:

    猜你喜欢
    • 2017-08-04
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 2020-03-06
    • 2017-02-12
    相关资源
    最近更新 更多