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

Dig*_*ohn 1 javascript amazon-s3 amazon-web-services node.js

我试图让我的头发试图让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
        }));
    }
});
Run Code Online (Sandbox Code Playgroud)

不幸的是亚马逊总是返回以下错误:

SignatureDoesNotMatch - 我们计算的请求签名与您提供的签名不匹配.检查您的密钥和签名方法.

有没有人成功获得JavaScript aws-sdk来成功执行此任务?有什么指针吗?我有两次和三次检查我的AWS Key和Secret.

问候:

John Chipps-Harding

Mic*_*bot 6

S3似乎在错误消息中给出了答案,尽管您可能无法识别它.

<StringToSign>PUT

image/jpeg
1390733729
x-amz-acl:public-read
/arenaupload/vV61536.jpg</StringToSign>
Run Code Online (Sandbox Code Playgroud)

对于任何给定的请求,只有一个可能的有效"要签名的字符串",如果你没有(或SDK没有)以该字符串开头,那么,当然,它将不起作用.

来自S3的错误响应没有提供您实际尝试签名的字符串,因为它不知道该信息.它会根据它拒绝的请求为您提供您应该尝试签名的字符串的规范版本.

您的解决方法正常,因为您已添加x-amz-acl:public-read到字符串到符号...但您的代码在原始问题中并未在任何地方指定该信息.我不知道JS-SDK所期望的格式是否ACL: "public-read"正是它想要看到的格式(大概是这样)params,但是看起来很明显你并没有要求SDK签署一个精确匹配的请求您随后尝试执行的实际上传.