【问题标题】:How to securely connect Firestore document with storage file如何安全地将 Firestore 文档与存储文件连接起来
【发布时间】:2020-01-04 07:24:19
【问题描述】:

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

为了实现这一点,我:

  1. 将文件上传到 Firebase 存储
  2. 上传成功后获取文件的下载链接。
  3. 使用链接到存储文件的 download_url 字段上传文档。

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

这有以下问题:

  • 我的 JavaScript 都是客户端的(我使用 Github Pages),因此有人可以简单地更改下载链接并将其放入文档上传中。
    我可以添加检查下载链接是否以https://firebasestorage.googleapis.com/v0/b/my_application.appspot.com/o/info 开头的firestore 规则,但这真的是最好的方法吗?
  • 如果要上传的文件是合法的,但文件不合法,文件将保存到我的存储中,但文件将被拒绝。没有参考文件,除非我手动删除它,否则它将始终保留在我的存储空间中。
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);
        });
}

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

【问题讨论】:

  • 请限制自己在每个帖子中回答一个问题。请注意,第二个问题之前已解决,通常意味着您需要运行定期进程来清理孤立文件。
  • 抱歉,在写这篇文章时,我意识到我目前的方法还有另一个问题 :)

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


【解决方案1】:

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

我看到了几个选项:

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

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

【讨论】:

    猜你喜欢
    • 2021-01-11
    • 2020-12-15
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多