0

我的场景:我需要生成一个安全的 url 来交给客户。该客户端将使用该 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 的查询字符串中,它会被忽略并且文件是私有的。

有人有指点吗?

4

1 回答 1

1

您是否希望此存储桶(或存储桶前缀)中的所有文件都可以公开阅读?

您可以使用存储桶策略而不是在请求中设置授权:https ://forums.aws.amazon.com/thread.jspa?messageID=185968#185968

于 2013-06-09T10:20:29.530 回答