我的方案:我需要生成一个安全的网址,以便传递给客户端。该客户端将使用该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的查询字符串中,它将被忽略,文件将保密。
有人有指针吗?
答案 0 :(得分:1)
您是否希望此存储桶(或存储桶前缀)中的所有文件都可公开读取?您可以使用存储分区策略而不是在请求中设置授权:https://forums.aws.amazon.com/thread.jspa?messageID=185968#185968