猿问

如何安全地将 Firestore 文档与存储文件连接起来

所以我需要将文档保存到我的 Firestore,每个文档都有一个文件链接(下载链接)。

为了实现这一目标,我:

  1. 将文件上传到 Firebase 存储

  2. 上传成功后获取文件的下载链接。

  3. 上传带有链接到存储文件的 download_url 字段的文档。

您可以在代码中看到这一点。

这有以下问题:

  • 我的 javascript 都是客户端(我使用 Github Pages),所以有人可以简单地更改下载链接并将其放入文档上传中。
    我可以添加 firestore 规则来检查下载链接是否以https://firebasestorage.googleapis.com/v0/b/my_application.appspot.com/o/info开头,但这真的是最好的方法吗?

  • 如果上传的文件合法,但文件不合法,文件将保存到我的存储中,但文件将被拒绝。没有参考该文件,除非我手动将其删除,否则它将始终保留在我的存储中。

function uploadFile(my_file) {

    // Create a root reference

    var storageRef = firebase.storage().ref();

    var uploadTask = storageRef.child('info/' + my_file.name).put(my_file);


    uploadTask.on('state_changed', function (snapshot) {

    }, function (error) {

        console.error("Error uploading file: ", error);

    }, function () {

        // Handle successful uploads on complete

        uploadTask.snapshot.ref.getDownloadURL().then(function (downloadURL) {

            uploadDocument(downloadURL);

        });

    });

}


function uploadDocument(downloadUrl) {

    var name = document.forms["infoForm"]["name"].value;

    var author = document.forms["infoForm"]["author"].value;


    var documentObject = {

        name: name,

        author: author,

        download_url: downloadUrl

    };


    db.collection("info").add(documentObject)

        .then(function (docRef) {

            console.log("Document written with ID: ", docRef.id);

        })

        .catch(function (error) {

            console.error("Error adding document: ", error);

        });

}

我不知道处理这个问题的最佳方法是什么。任何帮助将不胜感激:)


ibeautiful
浏览 180回答 1
1回答

慕尼黑8549860

借助 Firebase 安全规则,您可以对 Cloud Storage 和 Cloud Firestore 实施特定要求。但是您不能在安全规则中强制执行它们之间的依赖关系,因此无法验证用户放入数据库的下载 URL 是否与他们刚刚上传的文件相同。我看到几个选项:在 Cloud Functions 中实现上传文件和编写文档的整个操作。因此,您将实现一个云函数,它从用户那里获取所有必需的数据,然后写入文件和文档。通过这种方式,您可以确保始终是您的代码在编写代码,而用户无法通过编写自己的代码来解决这个问题。更改您写入数据库的内容。例如,如果您写入文档的路径而不是下载 URL,则可以确保该文件必须存在于 Cloud Storage 中。您甚至可以通过检查路径是否以其 UID 开头,然后在实现用户案例安全性的存储规则中来验证它是否在用户特定的文件夹中。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答