我正在尝试使用S3预签名的PUT网址执行文档上传。我使用Java AWS开发工具包( GeneratePresignedUrlRequest.java )生成了URL。该网址生成代码位于AWS API网关后面的lambda函数中。
但是,当我在Postman中复制生成的网址并尝试执行上传时,出现以下错误。
<Error>
<Code>AccessDenied</Code>
<Message>
There were headers present in the request which were not signed
</Message>
<HeadersNotSigned>host</HeadersNotSigned>
<RequestId>6E624EC66091A099</RequestId>
<HostId>
9HnUUZpa9zUWfyzuNrZtRkoN2CYxH8V6rqx5QgsMFC6foTZKuG5qmZL5ThnUXooYPk2reFzKKUg=
</HostId>
</Error>
生成的网址是“ https:// << strong> 存储桶 .s3.amazonaws.com / << strong> 密钥 >?X-Amz-Security-Token = << strong> 值 >>&X-Amz-Algorithm = AWS4-HMAC-SHA256&X-Amz-Date = 20180718T013339Z&X-Amz-SignedHeaders = content-type%253Bhost&X-Amz-Expires = 1799&X-Amz-Credential == << strong> value >&X-Amz-Signature = << strong> value >
关于在生成url时需要在此处进行更正的任何建议?
答案 0 :(得分:0)
错误确实与“标题丢失”有关,但与“ 主机”无关,这具有误导性。需要在 X-Amz-SignedHeaders = content-type%253Bhost中的“主机”之前的值“ 内容类型”作为请求标头明确提供http客户端使用预签名的url将文件上传到S3。
我在Java中生成的预签名网址为
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName,objectKey).withMethod(HttpMethod.PUT).withContentType("application/pdf").withExpiration(expiration);
因此,S3希望值为'application / pdf'的 content-type 作为预先签名的url请求的一部分,作为我所理解的签名匹配的标头