如何将x-amz-acl:public-read添加到Amazon S3 Secure Url

时间:2013-06-07 16:39:48

标签: node.js amazon-web-services amazon-s3

我的方案:我需要生成一个安全的网址,以便传递给客户端。该客户端将使用该URL直接将文件发布到S3。该文件随后可供公众使用。

我目前正试图通过单元测试找出所有运动部件。我正在使用knox模块的实现来生成安全URL。

这是我的测试:

'use strict';

var fs = require('fs'),
    knox = require('knox'),
    request = require('request'),
    config = require('../config');

var s3 = new knox.createClient({
    key     : config.aws.accessKey,
    secret  : config.aws.secretKey,
    bucket  : 'poopdart'
});

exports.url_generation = {
    put_object: function(test) {
        var file = '/foo/' + new Date().valueOf() + '.json';

        var qs = {
            'x-amz-acl': 'public-read'
        };
        var signedUrl = s3.signedUrl(file, new Date(new Date().getTime() + 5 * 60 * 1000), {
            verb: 'PUT',
            contentType: 'application/json'
//            qs: qs
        });

        console.log(signedUrl);

        var body = JSON.stringify({ date: new Date() });

        var options = {
                url: signedUrl,
                method: 'PUT',
                body: body,
                headers: {
                    'Content-Type': 'application/json',
                    'Content-Length': body.length,
                    'x-amz-acl': 'public-read'
                    }
                };

        request(options, function (err, response, data) {
            if(response.statusCode !== 200) console.log(data);
            test.equals(response.statusCode, 200);

            request.get('https://print-template-images.s3.amazonaws.com' + file, function (err, response, data) {
                test.equals(response.statusCode, 200);  // fails with 403
                test.done();
            });
        });
    }
};

注意:如果我将x-amz-acl标头添加到我的帖子请求中,则密钥验证失败。如果我将它添加到签名URL的查询字符串中,它将被忽略,文件将保密。

有人有指针吗?

1 个答案:

答案 0 :(得分:1)

您是否希望此存储桶(或存储桶前缀)中的所有文件都可公开读取?您可以使用存储分区策略而不是在请求中设置授权:https://forums.aws.amazon.com/thread.jspa?messageID=185968#185968