我的场景:我需要生成一个安全的 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 的查询字符串中,它会被忽略并且文件是私有的。
有人有指点吗?