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

时间:2019-08-31 09:46:14

标签: javascript firebase google-cloud-firestore firebase-storage github-pages

因此,我需要将文档保存到我的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);
        });
}

我不知道什么是最好的处理方式。任何帮助将不胜感激:)

1 个答案:

答案 0 :(得分:0)

使用Firebase安全规则,您可以对Cloud Storage和Cloud Firestore实施某些要求。但是您不能在安全规则中强制它们之间建立依赖关系,因此无法验证用户放入数据库中的下载URL是否与他们刚刚上传的文件相同。

我看到一些选择:

  1. 在Cloud Functions中实现上传文件并编写文档的整个操作。因此,您将实现一个Cloud Function,该Cloud Function从用户那里获取所有必需的数据,然后写入文件和文档。这样,您可以确定编写代码总是您的代码,并且用户无法通过编写自己的代码来解决此问题。

  2. 更改写入数据库的内容。例如,如果您编写文档的路径而不是下载URL,则可以确保该文件必须存在于Cloud Storage中。您甚至可以通过检查路径是否以其UID开头,然后在Storage rules implementing user-case security中,来验证它是否位于用户特定的文件夹中。