2014-01-25 24 views
1

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 - 哈丁

+0

您是否在此代码中遇到错误,或者您尝试将PUT转换为由此代码生成的signedURL? –

+0

@TheReddest代码没有错误,它确实返回了一个有效的URL。就在我尝试使用它的时候。附:我们有它的Python工作,所以我们知道前端是好的。另外...这是我们用来使用Python的指南... https://devcenter.heroku.com/articles/s3-upload-python – DigitalJohn

+0

@TheReddest这里有一些更多的信息.​​..显示排序的数据正在发送和收到的政策请求和亚马逊请求... http://pastebin.com/w3Psrep0 – DigitalJohn

回答

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签署一个请求精确地匹配您随后尝试执行的实际上传。

+0

迈克尔......非常感谢你正确诊断这个问题并提供答案。实际上'ACL:“公开阅读”'做了诡计! – DigitalJohn

+0

这个技巧可以帮助很多!我错过了ACL选项,因为我认为它没有必要,但事实证明它和aws.config.region一样!谢谢 – Biao

+1

即使使用指定的ACL,我仍然遇到此问题。 –

相关问题