无法获取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来签署与您随后尝试执行的实际上传完全匹配的请求。