无法使用带有预签名URL的Postman将文件上传到S3。错误:SignatureDoesNotMatch

时间:2019-01-06 16:51:26

标签: amazon-web-services amazon-s3 postman pre-signed-url

如何将带有签名URL的文件上传到S3?

我尝试了以下操作:

  const AWS = require('aws-sdk');
  const s3 = new AWS.S3({ accessKeyId: "", secretAccessKey: "" });

  const url = s3.getSignedUrl("putObject", {
    Bucket: "SomeBucketHere",
    Key: "SomeNameHere",
    ContentType: "binary/octet-stream",
    Expires: 600
  });

但是当我尝试通过以下步骤与Postman上传时,出现SignatureDoesNotMatch错误。

  1. 使用上述代码中URL的PUT方法
  2. 正文:binary(单选按钮),选择文件,然后选择要上传的文件
  3. 点击发送

我可以确认IAM权限不是这里的问题。我可以完全访问Bucket。

怎么了?如何测试我的签名URL?

2 个答案:

答案 0 :(得分:1)

这个问题曾经使我无比痛苦。

我要做的就是向邮递员请求添加标头。

标题: Content-Type = binary/octet-stream

更改此设置后,文件将成功上传。

希望这可以为别人省去很多麻烦。

答案 1 :(得分:0)

不确定是否有帮助,但是我相信您需要传递签名版本。

在python中,您有类似的东西:

import boto3 as boto3
from botocore.client import Config

...

s3_client = boto3.client('s3', config=Config(signature_version='s3v4'))
url = s3_client.generate_presigned_url(
            ClientMethod='put_object',
            Params={
                'Bucket': bucket,
                'Key': key,
            },
            ExpiresIn=60
        )
print url

所以Javascript中的等效项是:

var AWS = require('aws-sdk');
var s3 = new AWS.S3({
  signatureVersion: 'v4',
});


exports.handler = (event, context, callback) => {
  const url = s3.getSignedUrl('putObject', {
    Bucket: '**\[YOUR-S3-BUCKET\]**',
    Key: 'mykey',
    Expires: 10,
  });


  callback(null, url);
};

来源:

Presigned URL for S3 Bucket Expires Before Specified Expiration Time

Using pre-signed URLs to upload a file to a private S3 bucket