亚马逊S3,GET请求被禁止?

时间:2016-04-16 22:04:38

标签: angularjs amazon-web-services amazon-s3 get multer

我正在构建一个使用Multer-s3上传到Amazon存储桶的MEAN堆栈应用程序。 它似乎是将图像完美地上传到Amazon-S3中的存储桶以及数据库,但是当尝试从亚马逊获取图像时(使用ng-repeat)它会出现以下错误:

print

在我的mainController中:

GET https://s3-us-west-2.amazonaws.com/bucketfolder/bucketname/b40c4240-0417-11e6-9944-2d167e625d2b.jpg 403 (Forbidden)

我正在上传图片的Angular状态:

function mainController(Upload, API, S3_BUCKET, TokenService, User, $timeout) {
  var self = this;
  self.usersClothing = [];

  self.uploadSingle = function() {
    Upload.upload({
      url: API + '/upload/single',
      data: { file: self.file, type: self.clothingType }
    })
    .then(function(res) {
        self.usersClothing = res.data.user.clothing.map(function(clothing) {
            clothing.image = S3_BUCKET + clothing.image;
            return clothing;
        });
    })
    .catch(function(err) {
      console.error(err);
    });
  }

2 个答案:

答案 0 :(得分:2)

在您的上传代码段(POST)中,您的代码正在服务器上执行,并且(我假设您可以确认)使用IAM实例配置文件(角色)或访问密钥来访问您的S3存储桶。

但是,您将从服务器传递到S3对象的URL到客户端(浏览器)。并且是浏览器向对象发出对{3}}的请求。浏览器没有您的AWS凭据。

选项1

因此,对于浏览器从S3存储桶下载对象,存储桶及其对象需要公开,以便无需身份验证即可下载。

  1. 将“列出”权限授予“所有人”。
  2. 为您的存储桶制定政策。
  3. 示例存储桶策略:

    GET

    确保更改策略以替换真实存储桶名称。

    这不需要您进行任何代码更改。

    选项2(首选)

    但是,这意味着您的存储桶对全世界都是公开的。为避免这种情况,您应该生成一个预先签名的URL,供客户端使用。使用{ "Version": "2008-10-17", "Id": "Policy1397495964002", "Statement": [ { "Sid": "Stmt123", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::myBucketName/*" } ] } 生成预先签名的网址,并将该网址传递给您的客户端进行下载。

    这需要对服务器端代码进行一些代码更改。

答案 1 :(得分:0)

修正了问题: 在我的亚马逊桶中,我更改了图像的首选项并将其设置为公共。然后它就能够发出GET请求。