s3即使对于所有方法和起源也都没有进行预检

时间:2016-02-08 09:36:58

标签: node.js amazon-s3 cors

我不明白......看起来很简单,但是对于put请求的选项调用失败了。 "预检的响应无效"

S3 CORS:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

网址:

http://localhost:9002/api/sign_s3?file_name=wCyQZgrKIS24oR4MV4hdPP-UXDNQ6P9MvOj6DRMPcJU.jpg&file_type=image/jpeg

s3的网址(已删除密钥):

https://jayehtest.s3.amazonaws.com/wCyQZgrKIS24oR4MV4hdPP-UXDNQ6P9MvOj6DRMPcJU.jpg?AWSAccessKeyId=xxx&Content-Type=image%2Fjpeg&Expires=1454923884&Signature=xxx&x-amz-acl=public-read

生成put的代码:

    Aws.config.update({accessKeyId: process.env.AWS_ACCESS_KEY, secretAccessKey: process.env.AWS_SECRET_KEY});
    var s3 = new Aws.S3();
    var s3_params = {
        Bucket: process.env.S3_BUCKET,
        Key: req.query.file_name,
        //Expires: 120,
        //ContentType:  req.query.file_type,
        ContentType: "multipart/form-data",
        ACL: 'public-read-write',
    };
    s3.getSignedUrl('putObject', s3_params, function(err, data){
        console.log('got signed url!');
        if(err)
            res.status(500).json({error: err});
        else
            res.status(200).json({
                signed_request: data,
                url: 'https://'+process.env.S3_BUCKET+'.s3.amazonaws.com/'+req.query.file_name
            });
    });

发出请求的代码:

    Superagent('get', '/api/sign_s3?file_name='+files[0].name+'&file_type='+files[0].type).end(function(err, response) {
            console.log('signs3 response: ', response);

            Superagent('put', response.body.signed_request)
            //Superagent('put', 'https://jayehtest.s3-us-west-2.amazonaws.com/10172871_10101161917002037_713851410092755221_n.jpg?AWSAccessKeyId=AKIAJOQ7AL7QGIGSXMQQ&Content-Type=image%2Fjpeg&Expires=1454947575&Signature=nBvjbkCLD5XsvFktEjnQOTdRFzM%3D&x-amz-acl=public-read'
            .set('x-amz-acl', 'public-read-write')
            .set('Content-Type', 'multipart/form-data')
            .attach('image', files[0])
            .end(cb);
        });

1 个答案:

答案 0 :(得分:1)

S3有很多愚蠢的层,但我需要完成一些事情:

  1. 标题需要完全匹配。 Content-Type必须是角色的角色相同。

  2. x-amz-acl和节点上的ACL都需要设置为至少public-read

  3. 您需要在s3中生成一个存储桶策略,该策略为您的ACCESS_KEY提供权限

  4. 它需要是PUT请求[但这是我快速解决的问题]

  5. 注意:我创建了一个IAM用户,但后来没有使用它。 IAM用户甚至没有工作。它可以正常使用公钥。