无法让node.js返回一个有效的带符号PUT URL
Im撕裂我的头发,试图让S3 Direct客户端端PUT操作正常工作。无法让node.js返回一个有效的带符号PUT URL
我们有一个工作在Python上的后端代码版本,没有任何问题(所以我们知道前端工作正常),我们试图将后端移植到Node.JS.
我有一个返回签署PUT URL端点设置,这里是代码:
var objectKey = req.query.s3_object_name;
var objectType = req.query.s3_object_type;
var params = {
Bucket: s3Bucket,
Key: objectKey,
// ContentType: objectType, //(I have tried with and without this)
Expires: 60
};
s3.getSignedUrl('putObject', params, function(err, signedUrl){
if(err){
res.send(400);
}else{
res.end(JSON.stringify({
signed_request: signedUrl,
url: "http://"+s3Bucket+".s3.amazonaws.com/"+objectKey
}));
}
});
不幸的是亚马逊始终返回以下错误:
SignatureDoesNotMatch - 我们出的要求签名与您提供的签名不符。检查你的密钥和签名方法。
有没有人成功获得JavaScript aws-sdk来成功执行此任务?任何指针?我有两次和三次检查我的AWS密钥和秘密。
问候:
约翰Chipps - 哈丁
S3似乎是给你的错误消息的答案,虽然你可能不承认它是这样。
<StringToSign>PUT
image/jpeg
1390733729
x-amz-acl:public-read
/arenaupload/vV61536.jpg</StringToSign>
对于任何给定的要求,只有只有一个可能有效的“串签”,如果你不(或SDK不)以该字符串开始,然后,当然,它不会工作。
来自S3的错误响应不会给你的字符串,你实际上试图来签名,因为它不知道这些信息。它给你的字符串规范版本应该尝试签署,根据它拒绝的请求。
由于您已将x-amz-acl:public-read
添加到字符串符号中,因此您的解决方法正在运行,但原始问题中的代码并未在任何位置指定该信息。我不知道JS-SDK期望的格式是ACL: "public-read"
还是它想要看到的格式(大概在params
中)可以使这项工作成功,但看起来似乎很明显,您并未要求SDK签署一个请求精确地匹配您随后尝试执行的实际上传。
迈克尔......非常感谢你正确诊断这个问题并提供答案。实际上'ACL:“公开阅读”'做了诡计! – DigitalJohn
这个技巧可以帮助很多!我错过了ACL选项,因为我认为它没有必要,但事实证明它和aws.config.region一样!谢谢 – Biao
即使使用指定的ACL,我仍然遇到此问题。 –
您是否在此代码中遇到错误,或者您尝试将PUT转换为由此代码生成的signedURL? –
@TheReddest代码没有错误,它确实返回了一个有效的URL。就在我尝试使用它的时候。附:我们有它的Python工作,所以我们知道前端是好的。另外...这是我们用来使用Python的指南... https://devcenter.heroku.com/articles/s3-upload-python – DigitalJohn
@TheReddest这里有一些更多的信息...显示排序的数据正在发送和收到的政策请求和亚马逊请求... http://pastebin.com/w3Psrep0 – DigitalJohn