设置我的API以上传文件后,我意识到有一个特殊情况,你想要上传图片(jpg),你在API上定义了二进制支持,但是你得到以下错误:
The request signature we calculated does not match the signature you
provided. Check your AWS Secret Access Key and signing method.
Consult the service documentation for details.
The Canonical String for this request should have been
'PUT /test/vi-dummy-bucket/testImg2.jpg
content-type:application/x-www-form-urlencoded
host:qhweyos7z2.execute-api.us-west-1.amazonaws.com
x-amz-date:20170808T154441Z
x-amz-security-token: // security token string no quotes
content-type;host;x-amz-date;x-amz-security-token 5fa90f0 ...'
The String-to-Sign should have been
'AWS4-HMAC-SHA256\n20170808T154441Z
20170808/us-west-1/execute-api/aws4_request
f7a38fa ...'
奇怪的是,上传简单的文本文件与完全相同的api调用一起工作,那么我唯一需要改变的是
Content-Type 'text/plain'
并在请求的原始部分写一个文本。
如果我将所有内容保留在工作状态(正文中的text / plain&文本)并且只是将正文更改为二进制并设置图像,则不确定这是Content-Type问题还是Request Body Issue我得到了上述错误。
我正在使用的请求是:
PUT /test/vi-dummy-bucket/testImg2.jpg HTTP/1.1
Host: qhwe7z2.execute-api.us-west-1.amazonaws.com
Content-Type: application/x-www-form-urlencoded
X-Amz-Security-Token: FQoDYX ...
X-Amz-Date: 20170808T154441Z
Authorization: AWS4-HMAC-SHA256
Credential=ASIAJICO6JFTJWN7A/20170808/us-west-1/execute-
api/aws4_request, SignedHeaders=content-type;host;x-amz-date;x-amz-
security-token,
Signature=6a792 ... Cache-Control: no-cache
Postman-Token: e9d1f730-f50b-7e27-70cc-c15a138d8cc6
(二进制图像)
这是请求的另一个版本(相同的错误):
PUT /test/vi-dummy-bucket/testImg2.jpg HTTP/1.1
Content-Type: image/jpeg
x-amz-security-token: FQoDY ...
x-amz-date: 20170808T190134Z
Authorization: AWS4-HMAC-SHA256
Credential=ASIAIZSP5YKVLJ3GVVQA/20170808/us-west-1/execute-
api/aws4_request, SignedHeaders=content-type;host;x-amz-date;x-amz-
security-token,
Signature=b2324 ...
Host: qhos7z2.execute-api.us-west-1.amazonaws.com
Connection: close
User-Agent: Paw/3.1.2 (Macintosh; OS X/10.12.6) GCDHTTPRequest
Content-Length: 823236
---更新---
使用生成的SDK手动实施sigV4 sigining后,签名不再是问题。
唯一的问题是,生成的SDK只接受一个字符串作为" body",所以我必须将文件转换为二进制字符串。然后它正确传递并在S3中创建一个文件,但是现在大小是双倍的并且它不可见,就像二进制字符串没有被转换回二进制文件一样。太令人沮丧......
是的,我已经尝试过PASSTHROUGH和CONVERT_TO_BINARY。答案 0 :(得分:1)
更新:看起来这可能与Postman中的已知错误有关。这里有一个相关的SO问题供参考:AWS Signature Error using Postman to access the AWS API Gateway when posting a binary
以下是Postman的错误报告:https://github.com/postmanlabs/postman-app-support/issues/3232
如果您使用备用休息客户端和/或curl
或httpie
等命令行实用程序,请求是否有效?
如果你配置了二进制支持,你应该设置Content-Type
以匹配你发送的二进制内容。
根据您发布的内容,您使用Content-Type application/x-www-form-urlencoded
发送二进制内容,但如果正文实际上是二进制jpeg
文件,我希望您应该发送Content-Type image/jpeg