【问题标题】:SignatureDoesNotMatch Error S3 Presigned URLSignatureDoesNotMatch 错误 S3 预签名 URL
【发布时间】:2021-03-08 02:24:19
【问题描述】:

我正在使用generate_presigned_post()函数使用lambda生成一个预签名的url,如下:

response= s3_client.generate_presigned_post(
        Bucket = bucket_name,
        Key = key,
        ExpiresIn = 30
      )

响应格式为:

{
  "signed_url": {
    "url": "xxx",
    "fields": {
      "key": "xxx",
      "x-amz-algorithm": "xxx",
      "x-amz-credential": "xxx",
      "x-amz-date": "xxx",
      "x-amz-security-token": "xxx",
      "x-amz-signature": "xxx"
    }
  }
}

在客户端,我使用以下代码上传图片:

 function uploadToS3(data){
    var form = new FormData();
    var url  = JSON.parse(data["signed_url"])["url"]
    var fields = JSON.parse(data["signed_url"])["fields"]

    var presigned_url = url + fields.key + "?" +
    "X-Amz-Algorithm=" + fields["x-amz-algorithm"] +
    "&X-Amz-Credential=" + fields["x-amz-credential"] +
    "&X-Amz-Date=" + fields["x-amz-date"] +
    "&X-Amz-Expires=30"+
    "&X-Amz-SignedHeaders=host"+
    "&X-Amz-Security-Token=" + encodeURIComponent(fields["x-amz-security-token"]) +
    // "&policy="+ fields["policy"]
    "&X-Amz-Signature=" + fields["x-amz-signature"];


    form.append("file", $('#customFile1').get()[0].files[0], data['signed_url']['fields']['key']);

    // for (var pair of form.entries()) {
    // console.log(pair[0]+ ', ' + pair[1]); 
    // }
    $.ajax({
        type : 'POST',
        url: presigned_url,
        data: form,
        // timeout:0,
        processData:false,
        // mimeType: "multipart/form-data",
        contentType: false,
        success:function(resp){
            console.log(resp)
        },
        fail:function(resp){
            console.log(resp)
        },
        error:function(resp) {
            console.log(resp);
    }
    })
    }

我收到此错误,我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。

【问题讨论】:

    标签: python ajax amazon-s3 boto3


    【解决方案1】:

    尝试以下方法:

    function uploadToS3(data){
        var form = new FormData();
        var url  = JSON.parse(data["signed_url"])["url"]
        var fields = JSON.parse(data["signed_url"])["fields"]
    
        for (const k in fields) {
          const v = fields[k];
          formData.set(k, v);
        }
    
        formData.set("file", $('#customFile1').get()[0].files[0]);
    
        $.ajax({
            type : 'POST',
            url: url,
            data: form,
            // timeout:0,
            processData:false,
            mimeType: "multipart/form-data",
            contentType: false,
            success:function(resp){
                console.log(resp)
            },
            fail:function(resp){
                console.log(resp)
            },
            error:function(resp) {
                console.log(resp);
        }
        })
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-09
      • 1970-01-01
      • 1970-01-01
      • 2021-06-21
      • 2018-12-24
      • 1970-01-01
      • 2015-09-05
      • 2021-05-22
      相关资源
      最近更新 更多