无法获取node.js以返回有效的签名PUT URL

为了让S3 Direct客户端的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密钥和秘密。

问候:

约翰·奇普斯·哈丁

S3似乎在给你错误信息中的答案,虽然你可能没有认识到这一点。

 <StringToSign>PUT image/jpeg 1390733729 x-amz-acl:public-read /arenaupload/vV61536.jpg</StringToSign> 

对于任何给定的请求,只有一个可能的有效的“string签名”,如果你没有(或者SDK没有)以该string开始,那么当然,这是行不通的。

来自S3的错误响应不会给你实际尝试签名的string,因为它不知道这些信息。 它会根据请求拒绝的请求给出您应该尝试签名的string的规范版本。

您的解决方法正在工作,因为您已经将x-amz-acl:public-read到string到符号…但是原始问题中的代码没有在任何地方指定该信息。 我不知道JS-SDK期望的格式是ACL: "public-read"还是确切地说它将会以params ,但是看起来似乎很明显, SDK来签署与您随后尝试执行的实际上传完全匹配的请求。