我试图让我的头发试图让S3 Direct Client Side PUT操作起作用。
我们有一个在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 Key和Secret。
问候:
John Chipps-Harding
答案 0 :(得分:6)
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签署一个请求,该请求与您随后尝试执行的实际上载完全匹配。