gpt4 book ai didi

node.js - 预签名的 S3 URL 签名不匹配

转载 作者:搜寻专家 更新时间:2023-10-31 22:34:32 26 4
gpt4 key购买 nike

标题说明了一切。这是我的代码;

我正在为文件使用 node-formidable。

form.on("end",function(field, file){
params.Body = fs.createReadStream(params.filePath)
delete params.filePath;
S3.getSignedUrl('putObject',params, function(err, url) {
if(err){console.log(err);}
console.log(url);
});
})

上传成功后,url变量返回s3 url,类似这样;

https://bucket-name.s3.amazonaws.com/746575308_8c081369df.jpg?AWSAccessKeyId=[key]&Expires=[date]&Signature=[signature]&x-amz-acl=public-read

但仍然出现 SignatureDoesNotMatch 错误。在描述中说

The request signature we calculated does not match the signature you provided. Check your key and signing method.

这是我的参数

params = {
Bucket:"bucketname",
Key: file.name,
ACL: 'public-read'
}

我错过了什么?

最佳答案

我在服务器端使用 S3.getSignedUrl('putObject',然后尝试在客户端使用该 url 时遇到了同样的问题。

我在我的案例中注意到的可能与您的案例相关的是,使用所有 S3.getSignedUrl 创建的签名都考虑了请求 header 。因此,如果您正在生成一个 URL,它将失败并显示与您收到的相同的错误消息,除非使用相同的 header 发送。

一个失败的例子:像这样生成..

var params = { Bucket: 'YourBucket', Key: 'uniqueFileKey', Expires: 10000 };
s3.getSignedUrl('putObject', params, function (err, url) {
if(err){
return cb(err);
}
return cb(null, url)
});

当使用相同的 url 生成时,以下请求失败。此请求是从浏览器发出的。

RequestMethod: Put
Headers: {
Accept:*/*
Accept-Encoding:gzip, deflate, br
Accept-Language:en-US,en;q=0.9
Connection:keep-alive
Content-Length:11768
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
}

不同之处在于,上面创建的签名不包括内容类型,而请求确实指定了内容类型。参数需要匹配 header ,否则抛出的错误将是签名不匹配。

成功示例如下:

var params = { Bucket: 'YourBucket', Key: 'uniqueFileKey', Expires: 10000, ContentType: 'application/x-www-form-urlencoded; charset=UTF-8' };
s3.getSignedUrl('putObject', params, function (err, url) {
if(err){
return cb(err);
}
return cb(null, url)
});

关于node.js - 预签名的 S3 URL 签名不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24684959/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com