节点,React Native Fetch Blob,S3上传无效签名

时间:2018-12-30 12:32:34

标签: amazon-web-services react-native amazon-s3 aws-lambda

所以我一直盯着它看了一段时间,显然看不到任何错误,我从Lambda抓取了一个signatureURL,然后使用rn-fetch-blob上传到了它。

Lambda代码如下:

export default async (event, context, callback, utils) => {

    const { imageName } = JSON.parse(event.body)  
    console.log('​imageName', imageName)

    // These access keys relate to a user with AdministratorAccess
    utils.AWS.config.update({
        accessKeyId: 'XXXXX',
        secretAccessKey: 'XXXXXXX',
    })

    let s3 = new utils.AWS.S3({ signatureVersion: 'v4' })
    let params = { Bucket: 'MY_BUCKET', Key: imageName, Expires: 60, ContentType: 'image/jpeg' }
    let url = await s3.getSignedUrl('putObject', params)


    callback(null, utils.responder.success({ url.data.url }))
}

反应本机代码如下:

  const uploadImageToS3Endpoint =  (s3Url, imageUrl) => {


    var source = imageUrl.replace('file://', '')

    return RNFetchBlob.fetch('POST', s3Url, {
      'Content-Type': 'image/jpeg'
           }, RNFetchBlob.wrap(source))
  }

我回来了(连同大量其他内容,为简洁起见进行了编辑)

The request signature we calculated does not match the signature you provided. Check your key and signing method.

我也曾尝试将公共写入分配给S3存储桶,以证明这不是权限问题,但仍然得到相同的结果。任何建议将不胜感激,因为这应该很简单!

编辑

AWS响应RN提取

"<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><AWSAccessKeyId>THE_KEY</AWSAccessKeyId><StringToSign>AWS4-HMAC-SHA256
20181230T120956Z
20181230/eu-west-2/s3/aws4_request
b7b755c6335c0401711fafa241bbd816b5c7ad225c41cc324b0daaac2ee9f587</StringToSign><SignatureProvided>5345073e95a1dd39fa28f0a3c5c7350b2d7da75a5dedf3c2a895fdbd0e354961</SignatureProvided><StringToSignBytes>41 57 53 34 2d 48 4d 41 43 2d 53 48 41 32 35 36 0a 32 30 31 38 31 32 33 30 54 31 32 30 39 35 36 5a 0a 32 30 31 38 31 32 33 30 2f 65 75 2d 77 65 73 74 2d 32 2f 73 33 2f 61 77 73 34 5f 72 65 71 75 65 73 74 0a 62 37 62 37 35 35 63 36 33 33 35 63 30 34 30 31 37 31 31 66 61 66 61 32 34 31 62 62 64 38 31 36 62 35 63 37 61 64 32 32 35 63 34 31 63 63 33 32 34 62 30 64 61 61 61 63 32 65 65 39 66 35 38 37</StringToSignBytes><CanonicalRequest>POST
/C1E2DB45-CB94-4D3C-AEA7-C1CE4B42FCF1.jpg
Content-Type=image%2Fjpeg&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=AKIAJMVYRTCLXJGL2JGQ%2F20181230%2Feu-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20181230T120956Z&amp;X-Amz-Expires=60&amp;X-Amz-SignedHeaders=host
host:tthsshopproductimages.s3.eu-west-2.amazonaws.com

host
UNSIGNED-PAYLOAD</CanonicalRequest><CanonicalRequestBytes>50 4f 53 54 0a 2f 43 31 45 32 44 42 34 35 2d 43 42 39 34 2d 34 44 33 43 2d 41 45 41 37 2d 43 31 43 45 34 42 34 32 46 43 46 31 2e 6a 70 67 0a 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3d 69 6d 61 67 65 25 32 46 6a 70 65 67 26 58 2d 41 6d 7a 2d 41 6c 67 6f 72 69 74 68 6d 3d 41 57 53 34 2d 48 4d 41 43 2d 53 48 41 32 35 36 26 58 2d 41 6d 7a 2d 43 72 65 64 65 6e 74 69 61 6c 3d 41 4b 49 41 4a 4d 56 59 52 54 43 4c 58 4a 47 4c 32 4a 47 51 25 32 46 32 30 31 38 31 32 33 30 25 32 46 65 75 2d 77 65 73 74 2d 32 25 32 46 73 33 25 32 46 61 77 73 34 5f 72 65 71 75 65 73 74 26 58 2d 41 6d 7a 2d 44 61 74 65 3d 32 30 31 38 31 32 33 30 54 31 32 30 39 35 36 5a 26 58 2d 41 6d 7a 2d 45 78 70 69 72 65 73 3d 36 30 26 58 2d 41 6d 7a 2d 53 69 67 6e 65 64 48 65 61 64 65 72 73 3d 68 6f 73 74 0a 68 6f 73 74 3a 74 74 68 73 73 68 6f 70 70 72 6f 64 75 63 74 69 6d 61 67 65 73 2e 73 33 2e 65 75 2d 77 65 73 74 2d 32 2e 61 6d 61 7a 6f 6e 61 77 73 2e 63 6f 6d 0a 0a 68 6f 73 74 0a 55 4e 53 49 47 4e 45 44 2d 50 41 59 4c 4f 41 44</CanonicalRequestBytes><RequestId>4E4DFD848923AC27</RequestId><HostId>DljdK6KPnzAeXxwUyYu32gb4g4JRI8kDTsdqZVqcM3wLYBsZ6kfT8UGZq6FI5/VimHdY6iL8eKg=</HostId></Error>"

1 个答案:

答案 0 :(得分:0)

      RNFetchBlob.fetch(
            'PUT',
            link,
            {
                'Content-Type': undefined
            },
            RNFetchBlob.wrap(Platform.OS === "android" ? this.selectedImage.uri : this.selectedImage.uri.replace("file://", "")),
        )
            .then((resp) => {
                console.log("Response data", resp)
                this.onImageUploadSuccess(resp)
            }).catch((err) => {
                this.onUploadFailure(err)
            })

这对我有用