从过去的3天开始,我陷入同样的签名问题。我不明白如何摆脱这个。
我正试图通过以下方式获得预先签名的网址:
s3.getSignedUrl('putObject',
event.pre_signed_url =
{Bucket:config.awsBucket,Key:event.filename}
); in Node js.
这个预先签名的网址我用来上传s3存储桶中的图像文件:
request({
method:'PUT',
url: event.pre_signed_url,
ContentType: 'image/png',
body: fs.createReadStream('./image.png')}
, function(err, res, body)
{ if(err)console.log(err); return callback(body); }
);
该文件已成功上传到s3存储桶,我可以在aws s3存储桶控制台中看到。
问题是,如果我尝试使用来自终端的curl或尝试在浏览器中打开网址尝试使任何其他图像文件丢弃,我会收到预先签名的网址,这会给我带来签名错误匹配错误。
如果我做错了或者我对预先签名的网址使用的理解是错误的,请指导我。
答案 0 :(得分:0)
我在使用S3.getSignedUrl('putObject'
,服务器端,然后尝试使用该网址时遇到了同样的问题。您正在请求中设置一个额外的标头,该标头未在参数中设置。
在我的案例中,我注意到的可能与您的相关的是,使用所有S3.getSignedUrl
创建的签名会考虑请求标头。因此,如果您要生成一个URL,它将失败并显示您收到的相同错误消息,除非使用相同的标题发送。
失败的一个例子:像这样生成..
var params = { Bucket: 'YourBucket', Key: 'uniqueFileKey', Expires: 10000 };
s3.getSignedUrl('putObject', params, function (err, url) {
if(err){
return cb(err);
}
return cb(null, url)
});
使用相同的url生成时,以下请求失败。此请求来自浏览器。
RequestMethod: Put
Headers: {
Accept:*/*
Accept-Encoding:gzip, deflate, br
Accept-Language:en-US,en;q=0.9
Connection:keep-alive
Content-Length:11768
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
}
不同之处在于上面创建的签名不包含内容类型,其中请求确实指定了内容类型。参数需要匹配标题,否则抛出的错误将是签名不匹配。
下面的成功示例:
var params = { Bucket: 'YourBucket', Key: 'uniqueFileKey', Expires: 10000, Content-Type: 'application/x-www-form-urlencoded; charset=UTF-8' };
s3.getSignedUrl('putObject', params, function (err, url) {
if(err){
return cb(err);
}
return cb(null, url)
});