用邮递员呼叫 S3 pre-signed URL
Call S3 pre-signed URL with postman
我正在尝试使用 pre-signed URL 按照文档中的描述进行上传 (https://docs.aws.amazon.com/AmazonS3/latest/dev/PresignedUrlUploadObject.html) 我可以检索 pre-signed URL 但是当我尝试在 Postman 中执行 PUT 时,收到以下错误:
<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 的 header 修改为 multipart/form-data 和 application/octet-stream。我还尝试取消勾选邮递员中的 headers 部分,并在 select 文件中依赖 form-data 和二进制设置的 body 类型。 form-data 设置导致将以下内容添加到调用中:
Content-Disposition: form-data;名字="thefiletosend.txt";文件名="thefiletosend.txt
另外,我注意到 postman 包括它所谓的 "temporary headers" 如下:
主持人:s3.amazonaws.com
Content-Type: text/plain
User-Agent: PostmanRuntime/7.13.0
接受:/
Cache-Control: no-cache
Postman-Token: e11d1ef0-8156-4ca7-9317-9f4d22daf6c5,2135bc0e-1285-4438-bb8e-b21d31dc36db
主持人:s3.amazonaws.com
accept-encoding: gzip, deflate
content-length: 14
连接:keep-alive
cache-control: no-cache
Content-Type header 可能是问题之一,但我不确定如何在 postman 中排除这些 "temporary headers"。
我在 lambda 中生成 pre-signed 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(在我屏蔽了敏感信息和特定于应用程序的信息之后):
{
"attachmentName": "MySecondAttachment.docx",
"url": "https://my-s3-bucket.s3.amazonaws.com/",
"fields": {
"acl": "public-read",
"Content-Type": "multipart/form-data",
"key": "attachment-upload/R271645/65397746_MySecondAttachment.docx",
"x-amz-algorithm": "AWS4-HMAC-SHA256",
"x-amz-credential": "WWWWWWWW/20200318/us-east-1/s3/aws4_request",
"x-amz-date": "20200318T133309Z",
"x-amz-security-token": "XXXXXXXX",
"policy": "YYYYYYYY",
"x-amz-signature": "ZZZZZZZZ"
}
}
在 Postman 中,创建一个 POST 请求,并使用“form-data”输入您返回的所有字段,与您在 signed[=32= 中返回的字段名称完全相同] 如上所示。但是,不要设置内容类型。然后再添加一个名为“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]
]
)
希望对您有所帮助。
你的 pre-signed url 应该是 https://bucket-name.s3.region.amazonaws.com/folder/filename.jpg?AWSAccessKeyId=XXX&Content-Type=image%2Fjpeg&Expires=XXX&Signature=XXX
您可以通过
使用postman上传到S3
- 在上面设置 url 作为端点
- Select
PUT
请求,
Body
-> binary
-> Select file
您可以通过
使用postman上传到S3
将 url 设置为端点
Select PUT 请求,
主体 -> 二进制 -> Select 文件
我正在尝试使用 pre-signed URL 按照文档中的描述进行上传 (https://docs.aws.amazon.com/AmazonS3/latest/dev/PresignedUrlUploadObject.html) 我可以检索 pre-signed URL 但是当我尝试在 Postman 中执行 PUT 时,收到以下错误:
<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 的 header 修改为 multipart/form-data 和 application/octet-stream。我还尝试取消勾选邮递员中的 headers 部分,并在 select 文件中依赖 form-data 和二进制设置的 body 类型。 form-data 设置导致将以下内容添加到调用中:
Content-Disposition: form-data;名字="thefiletosend.txt";文件名="thefiletosend.txt
另外,我注意到 postman 包括它所谓的 "temporary headers" 如下:
主持人:s3.amazonaws.com Content-Type: text/plain User-Agent: PostmanRuntime/7.13.0 接受:/ Cache-Control: no-cache Postman-Token: e11d1ef0-8156-4ca7-9317-9f4d22daf6c5,2135bc0e-1285-4438-bb8e-b21d31dc36db 主持人:s3.amazonaws.com accept-encoding: gzip, deflate content-length: 14 连接:keep-alive cache-control: no-cache
Content-Type header 可能是问题之一,但我不确定如何在 postman 中排除这些 "temporary headers"。
我在 lambda 中生成 pre-signed 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(在我屏蔽了敏感信息和特定于应用程序的信息之后):
{
"attachmentName": "MySecondAttachment.docx",
"url": "https://my-s3-bucket.s3.amazonaws.com/",
"fields": {
"acl": "public-read",
"Content-Type": "multipart/form-data",
"key": "attachment-upload/R271645/65397746_MySecondAttachment.docx",
"x-amz-algorithm": "AWS4-HMAC-SHA256",
"x-amz-credential": "WWWWWWWW/20200318/us-east-1/s3/aws4_request",
"x-amz-date": "20200318T133309Z",
"x-amz-security-token": "XXXXXXXX",
"policy": "YYYYYYYY",
"x-amz-signature": "ZZZZZZZZ"
}
}
在 Postman 中,创建一个 POST 请求,并使用“form-data”输入您返回的所有字段,与您在 signed[=32= 中返回的字段名称完全相同] 如上所示。但是,不要设置内容类型。然后再添加一个名为“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]
]
)
希望对您有所帮助。
你的 pre-signed url 应该是 https://bucket-name.s3.region.amazonaws.com/folder/filename.jpg?AWSAccessKeyId=XXX&Content-Type=image%2Fjpeg&Expires=XXX&Signature=XXX
您可以通过
使用postman上传到S3- 在上面设置 url 作为端点
- Select
PUT
请求, Body
->binary
->Select file
您可以通过
使用postman上传到S3将 url 设置为端点 Select PUT 请求, 主体 -> 二进制 -> Select 文件