S3 预签名上传 url 错误
Posted
技术标签:
【中文标题】S3 预签名上传 url 错误【英文标题】:S3 presigned upload url error 【发布时间】:2018-12-24 20:56:31 【问题描述】:我正在尝试使用 S3 预签名的 PUT url 执行文档上传。我使用 java AWS SDK (GeneratePresignedUrlRequest.java) 生成了 url。此 url 生成代码位于 AWS API 网关后面的 lambda 函数中。
但是,当我在 Postman 中复制生成的 url 并尝试执行上传时,出现以下错误。
<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>
生成的url是“https://bucket>.s3.amazonaws.com/key>?X-Amz-Security-Token=值>&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20180718T013339Z&X-Amz-SignedHeaders =content-type%253Bhost&X-Amz-Expires=1799&X-Amz-Credential=值>&X-Amz-Signature=值 em>>
关于在生成 url 时需要更正的内容有什么建议吗?
【问题讨论】:
【参考方案1】:该错误确实与“缺少标头”有关,但与具有误导性的“主机”无关。 X-Amz-SignedHeaders=content-type%253Bhost 中 'host' 之前的值 'content-type' 需要在以下情况下显式提供为请求标头http 客户端使用预签名的 url 将文件上传到 S3。
我在java中生成了预签名的url为
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName,objectKey).withMethod(HttpMethod.PUT).withContentType("application/pdf").withExpiration(expiration);
因此,据我所知,S3 期望 content-type 值 'application/pdf' 成为预签名 url 请求的一部分,作为签名匹配的标头.
【讨论】:
以上是关于S3 预签名上传 url 错误的主要内容,如果未能解决你的问题,请参考以下文章
使用预签名 URL 上传到 S3 存储桶会出现 403 禁止错误
使用预签名 URL 将文件上传到 Amazon S3 时出现 CORS 错误
仅从浏览器使用预签名 URL 上传时出现 AWS S3 CORS 错误