然而,Amazon S3签名工作被禁止

时间:2017-03-02 10:04:24

标签: javascript amazon-web-services amazon-s3

module.exports = function (express, router) {
    var _ = require('lodash'),
        aws = require('aws-sdk'),
        AWSConfig = require('../../config/AWSConfig.json');

    router.route('/resource/file/sign')
        .post(function (req, res) {
            var bucket = "myTestBucket";
            aws.config.update({accessKeyId: AWSConfig.AWS_ACCESS_KEY, secretAccessKey: AWSConfig.AWS_SECRET_KEY});

            var s3 = new aws.S3();
            var options = {
                Bucket: bucket,
                Key: req.body.name,
                Expires: 60,
                ContentType: req.body.type,
                ACL: 'private'
            };

            s3.getSignedUrl('putObject', options, function (err, data) {
                if (err) {
                    return res.send('Error with S3')
                }
                res.json({
                    signed_request: data,
                    url: 'https://s3.amazonaws.com/' + bucket + '/' + req.body.name
                })
            })

        });


    return router;
};

此请求返回signed_request并正常工作。

但是,当我尝试上传到网址时,我会在forbidden请求中获得OPTIONS

我也收到CORS错误:

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access. The response had HTTP status code 403.

这是我第一次尝试使用amazon s3,所以我希望你们中的一些人能够指导我朝着正确的方向前进。

更新

我没有尝试编辑权限和cors标题现在cors错误消失但我仍然被禁止上传。

这是我的配置:

广告管理政策

    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddCannedAcl",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::learningbank-test/*"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": [
                        "public-read"
                    ]
                }
            }
        }
    ]
}

权限:

enter image description here

控制台错误(在我的结尾) enter image description here

1 个答案:

答案 0 :(得分:1)

您可以在存储桶上定义跨源资源共享(CORS)规则。有关详细信息和示例,请参阅documentation

此外,请确保存储桶权限允许给定用户写入。从Introduction to S3 access controlUsing bucket policies开始。

<强>更新

当请求中的canned ACL等于PutObject时,您已在存储桶策略中定义了public-read次授权。使用HTTP请求中的s3:x-amz-acl标头继承该信息。

但是,您已在代码中将ACL定义为private。尝试将其设置为public-read以使其与存储桶策略声明匹配。