服务器端调用FineUploader deleteFile()函数返回AWS SignatureDoesNotMatch - 403错误

时间:2016-06-16 15:46:02

标签: node.js amazon-web-services amazon-s3 delete-file fine-uploader

我的应用程序允许管理员用户使用FineUploader直接上传到S3来构建图库。此过程还将文档存储在我的本地MongoDB数据库中,引用上传的图像,如...

{
   "filename": "user_supplied_image (thumb).jpg",
   "caption": "User supplied caption of image",
   "title": "User supplied title of image",
   "URL_thumb": "http://exnihilodev.s3-us-west-2.amazonaws.com/images/risingcrane/d73dbd42-8593-430e-a0f3-bb8512035863.jpg",
   "URL_full": "http://exnihilodev.s3-us-west-2.amazonaws.com/images/risingcrane/abf38056-f9f2-4ecb-9f66-c71ca59b3e6f.jpg" 
}

这一切都很好。我允许站点管理员从库中删除任何向我的服务器发出DELETE请求的图像,其中运行以下代码...

// Handler for DELETE /gallery-admin photo delete
app.delete('/gallery-admin', function(req, res) {

    var photo = req.body;
    rcProv.deletePhoto(photo, function(error, docs) {
        if(error) {
            res.send(error);
            console.re.log(error);
        }
        else{
            //1st delete both of the S3 images files associated with this photo
            var key1 = docs.URL_thumb.slice(docs.URL_thumb.indexOf('images/'));
            deleteFile(expectedBucket, key1, function(err) {
                if (err) {
                    console.re.log("Problem deleting file: %s - %s",key1, err);
                    res.status(500);
                }
                res.end();
            });
            var key2 = docs.URL_full.slice(docs.URL_full.indexOf('images/'));;
            deleteFile(expectedBucket, key2, function(err) {
                if (err) {
                    console.re.log("Problem deleting file: %s - %s",key2, err);
                    res.status(500);
                }
                res.end();
            });
            //last, delete the photo record from the db
            photo.remove = true;
            rcProv.deletePhoto(photo, function(error, docs){
                console.re.log('deleted photo successfully: %s',docs);
                res.send({"status":"success"});
            });
        }
    });
});

/ gallery-admin的我的DELETE路由调用我的内部函数'deletePhoto()',传入照片的MongoDb id,该照片检索文档并将其返回到回调的docs var中。然后解析它以获取上载到S3的缩略图和完整图像文件的文件名。这些文件名用于构建密钥,然后传递给FineUploader函数deleteFile()的两个后续调用。

FineUploader deleteFile()函数有两个参数bucketkey,其中bucket由以下代码行var expectedBucket = process.env.S3_BUCKET;提供(相同的全局变量为在上传过程中使用的其他FineUploader函数中使用)并且key提供以下代码行...

var key1 = docs.URL_thumb.slice(docs.URL_thumb.indexOf('images/'));

...它提供了最初上传文件时传递给FineUploader signPolicy()函数的确切键值,基本上是'folder / UUID。[文件扩展名]'的模式。我假设这是deleteFile()正在寻找的“关键”。这可能是我的问题。

我从S3服务器返回的响应是..

{
    "message": "The request signature we calculated does not match the signature you provided. Check your key and signing method.",
    "code": "SignatureDoesNotMatch",
    "time": "2016-06-16T12:11:47.191Z",
    "statusCode": 403,
    "retryable": false,
    "_willRetry": false
}

我已经检查了我的CORS配置并确认我允许使用DELETE方法。

我尝试将key值更改为原始文件网址的各种排列,从完整的“http:// ...”更改为UUID。[文件扩展名],但没有更改结果

用于上传文件的AWS密钥与用于尝试删除相同文件的密钥相同。

我很欣赏有人可能提供的这个问题的任何见解。

提前致谢。

0 个答案:

没有答案