【问题标题】:Can't get node.js to return a valid signed PUT URL无法让 node.js 返回有效的签名 PUT URL
【发布时间】:2014-01-27 02:41:05
【问题描述】:

我试图让 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 密钥和秘密。

问候:

约翰·奇普斯-哈丁

【问题讨论】:

  • 您是否收到此代码中的错误,或者当您尝试 PUT 到此代码生成的签名 URL 时?
  • @TheReddest 代码没有错误,它确实返回了一个看起来有效的 URL。就在我尝试使用它的时候。附:我们让它在 Python 上工作,所以我们知道前端很好。还有……这是我们用来让它在 Python 中工作的指南……devcenter.heroku.com/articles/s3-upload-python
  • @TheReddest 这里有更多信息......显示了为策略请求和亚马逊请求发送和接收的数据类型......pastebin.com/w3Psrep0
  • @TheReddest 在玩了更多之后......看起来我让它工作了,但我不满意解决方案是手动完成而不是使用内置 aws-sdk 功能。我的解决方法可以在这里看到:forums.aws.amazon.com/thread.jspa?messageID=519010&#519010

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


【解决方案1】:

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

【讨论】:

  • Michael... 非常感谢您正确诊断此问题并提供答案。确实 ACL: "public-read" 成功了!
  • 这个技巧很有帮助!我错过了 ACL 选项,因为我认为它没有必要,但事实证明它是,而且 aws.config.region 也是如此!谢谢
  • 我仍然遇到这个问题,即使指定了 ACL。
  • @JoelCDoyle 通常是@JoelCDoyledownvoting answers is typically done “每当你遇到一个极其草率、不费吹灰之力的帖子,或者一个明显不正确且可能非常不正确的答案时。”答案不符合该标准,并且 OP 问题的正确解决方案,所以我认为这里不需要投票。当然,SignatureDoesNotMatch 的原因有很多,所以如果您遇到问题,应该提出一个新问题。
猜你喜欢
  • 2017-03-03
  • 2017-12-27
  • 1970-01-01
  • 2020-10-09
  • 2019-05-22
  • 2013-05-12
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多