Amazon web services 通过邮递员调用S3预签名URL
我正试图使用预签名的URL进行上传,如文档中所述(),我可以检索预签名的URL,但当我尝试进行投递时,我收到以下错误:Amazon web services 通过邮递员调用S3预签名URL,amazon-web-services,amazon-s3,postman,pre-signed-url,Amazon Web Services,Amazon S3,Postman,Pre Signed Url,我正试图使用预签名的URL进行上传,如文档中所述(),我可以检索预签名的URL,但当我尝试进行投递时,我收到以下错误: <Code>SignatureDoesNotMatch</Code> <Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
显然,我的put调用的结构方式与AWS计算签名的方式不匹配。我找不到很多关于这个put调用需要什么的信息
我尝试将Content Type的标题修改为multipart/form data和application/octet stream。我还尝试在postman中取消选中headers部分,并在选择文件时依赖于表单数据和二进制设置的body类型。表单数据设置会在调用中添加以下内容:
内容配置:表单数据;name=“thefiletosend.txt”;filename=“thefiletosend.txt
此外,我注意到postman包含了它所谓的“临时标题”,如下所示:
public string FunctionHandler(Input input, ILambdaContext context)
{
_logger = context.Logger;
_key = input.key;
_bucketname = input.bucketname;
string signedURL = _s3Client.GetPreSignedURL(new GetPreSignedUrlRequest()
{
Verb = HttpVerb.PUT ,
Protocol = Protocol.HTTPS,
BucketName = _bucketname,
Key = _key,
Expires = DateTime.Now.AddMinutes(5)
});
returnObj returnVal = new returnObj() { url = signedURL };
return JsonConvert.SerializeObject(returnVal);
}
主持人:s3.amazonaws.com
内容类型:文本/纯文本
用户代理:PostmanRuntime/7.13.0
接受:/
缓存控制:没有缓存
邮递员代币:e11d1ef0-8156-4ca7-9317-9F4D22DAF6C52135BC0E-1285-4438-bb8e-b21d31dc36db
主持人:s3.amazonaws.com
接受编码:gzip,deflate
内容长度:14
连接:保持活力
缓存控制:没有缓存
内容类型标题可能是问题之一,但我不确定如何在postman中排除这些“临时标题”
我正在lambda中生成预签名URL,如下所示:
public string FunctionHandler(Input input, ILambdaContext context)
{
_logger = context.Logger;
_key = input.key;
_bucketname = input.bucketname;
string signedURL = _s3Client.GetPreSignedURL(new GetPreSignedUrlRequest()
{
Verb = HttpVerb.PUT ,
Protocol = Protocol.HTTPS,
BucketName = _bucketname,
Key = _key,
Expires = DateTime.Now.AddMinutes(5)
});
returnObj returnVal = new returnObj() { url = signedURL };
return JsonConvert.SerializeObject(returnVal);
}
我能够通过POST请求在Postman中实现这一点。以下是对我有效的细节。当我调用lambda获取预先签名的URL时,这里是返回的json(在我屏蔽敏感和特定于应用程序的信息后): 在Postman中,创建一个POST请求,并使用“表单数据”输入您返回的所有字段,字段名称与您在上述signedURL中返回的字段名称完全相同。但是,不要设置内容类型。然后再添加一个名为“file”的键: 如果单击word文件右侧的下拉列表,则可以浏览到文件并将其附着: 如果有帮助,我将使用python编写的lambda生成一个预签名URL,以便用户可以上载附件。代码如下所示:
signedURL = self.s3.generate_presigned_post(
Bucket= "my-s3-bucket",
Key=putkey,
Fields = {"acl": "public-read", "Content-Type": "multipart/form-data"},
ExpiresIn = 15,
Conditions = [
{"acl": "public-read"},
["content-length-range", 1, 5120000]
]
)
希望这有帮助。您的预签名url应该类似于
https://bucket-name.s3.region.amazonaws.com/folder/filename.jpg?AWSAccessKeyId=XXX&Content-Type=image%2Fjpeg&Expires=XXX&Signature=XXX
您可以通过以下方式与邮递员一起上传到S3
PUT
request正文
->二进制
->选择文件
您的预签名url应该是 您可以通过以下方式与邮递员一起上传到S3 将上面的url设置为端点 选择PUT请求,
Body->binary->Select file相关:使用基于表单的上载的问题在于,它会修改正在上载的文件并附加这些附加值。-------------------------------------32452463456766内容处置:表单数据;name=“file”;filename=“employee.csv”内容类型:text/csv