【问题标题】:S3 presigned upload url errorS3 预签名上传 url 错误
【发布时间】: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 时需要更正的内容有什么建议吗?

【问题讨论】:

    标签: amazon-web-services amazon-s3 aws-lambda aws-api-gateway


    【解决方案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 请求的一部分,作为签名匹配的标头.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-31
      • 1970-01-01
      • 2021-08-26
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      • 2018-07-19
      相关资源
      最近更新 更多