无法让node.js返回有效的签名PUT URL

时间:2014-01-25 13:12:25

标签: javascript node.js amazon-web-services amazon-s3

我试图让我的头发试图让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

1 个答案:

答案 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签署一个请求,该请求与您随后尝试执行的实际上载完全匹配。