首页 > 解决方案 > 如何保持 Firestore 和 Firebase 存储同步

问题描述

我正在开发我的第一个使用 firebase 构建的站点,并且对“无服务器”架构有点害怕。我习惯于做很多后端验证,让客户决定太多事情让我想要非常防御。

一个这样的例子就是这样。用户可以提交帖子。帖子可以包含文件。每个孤立的人都是可以管理的

firestore().collection('posts').add({
  title: "my new post",
  author: "my username",
  uploaded: new Date(),
  location: "a10b308cd" // some location in firebase storage
});

我可以使用 Firestore 规则来确保作者与经过身份验证的用户相匹配,诸如此类。

同样,我可以上传文件:

const uuid = new UUID();
const ref = firebase.storage().ref().child(uuid);
ref.put(file)

但是我很困惑我应该如何将这两者联系在一起。解决方案似乎是客户端为存储位置提供了一个 UUID(甚至命名空间给用户) - 并firestore.add()在调用和ref.put()调用中使用它。

不过,我似乎无法做很多事情来验证这种行为是否正确。我不习惯必须信任客户将文件放置在我后端的正确位置。不太可能会有很多恶意客户端制作混乱的链接,但这仍然让我非常不安。

甚至不是恶意场景,但如果我的存储没有提交(例如由于互联网问题或不正确的文件上传违反存储规则)并且客户端仍然尝试添加文档,我将无法firestore.rules确定他们是否' res 一个他们正在链接的文件。

我有一个正则表达式来确定 uuid 是否看起来像 uuid,但客户仍然可以将其设置为“deadbeef1010101010”,我无法阻止它!随机生成的后端 UUID 比依赖客户端更可取——即使它们在命名空间时并不重要。

我在想这一切都错了吗?

标签: firebasegoogle-cloud-firestorefirebase-authenticationgoogle-cloud-storage

解决方案


推荐阅读