过去三天我陷入了同样的签名问题。我不明白如何摆脱这个困境。
我正在尝试使用以下内容获取预签名网址:
s3.getSignedUrl('putObject',
event.pre_signed_url =
{Bucket:config.awsBucket,Key:event.filename}
); in Node js.
我使用这个预签名 URL 将图像文件上传到 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 放置任何其他图像文件或尝试在浏览器中打开该URL,我得到的预签名URL 会给我签名不匹配错误。
如果我做错了或者我对预签名网址使用的理解是错误的,请指导我。
最佳答案
我在使用 S3.getSignedUrl('putObject'
, 服务器端,然后尝试使用该 url 客户端时遇到了同样的问题。您在请求上设置了一个额外的 header ,但该 header 未被处理在参数中设置。
在我的案例中,我注意到(可能与您的案例相关)是使用所有 S3.getSignedUrl
创建的签名都会考虑请求 header 。因此,如果您生成 URL,它将失败并显示您收到的相同错误消息,除非使用相同的 header 发送。
一个失败的例子:像这样生成..
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
}
不同之处在于,上面创建的签名不包含内容类型,而请求确实指定了内容类型。参数需要匹配 header ,否则抛出的错误将是签名不匹配。
成功示例如下:
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)
});
关于node.js - 错误 : The request signature we calculated does not match the signature you provided. 检查您的 key 和签名方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42245981/