Firebase 上传保护

Posted

技术标签:

【中文标题】Firebase 上传保护【英文标题】:Firebase upload protection 【发布时间】:2022-01-02 21:39:32 【问题描述】:

我正在构建一个用户可以上传图片的应用。我使用firebase作为后端。现在既然所有登录的用户都可以上传,我该如何安全地管理呢? 图片通过 firebase 存储上传,然后将 URL 保存到 Firestore。 我有两个选择:

将 URL 添加到 Firestore,然后可以上传图像。 这样做的好处是,在添加新的 Firestore 文档后,我可以授予用户上传文件的权限。缺点是添加文档后上传可能会失败。这意味着 Firestore 中有一个 URL,而 Storage 中没有图像。 图像上传到存储,然后添加 Firestore 文档。 这样做的好处是每个文档都附有一张图片,但这也意味着每个用户都可以上传他们想要的每张图片,而我没有任何控制权。

我确实使用了 firebase 云函数,但如果我先添加文档,则会调用云函数,而图像可能无法完成上传。解决这个问题的最佳方法是什么?

【问题讨论】:

“这样做的好处是,在添加新的 Firestore 文档后,我可以授予用户上传文件的权限。” => 你打算如何给用户权限?请注意,您无法在 Cloud Storage 规则中读取 Firestore 数据库。我能看到的唯一方法是使用自定义声明,但它们可能需要时间来传播。 【参考方案1】:

如果您认为可以添加到批处理操作、Firestore 添加操作和 Firebase 存储文件上传操作,并确保两者都是完整的,这样您可以获得一致的数据,请注意这是不可能的。这些操作是不同 Firebase 服务的一部分,不幸的是,在我写这个答案的那一刻,你无法将它们变成原子的。

据我所知,Firebase 产品都不支持跨产品事务操作。要解决此问题,您必须在添加/上传操作期间嵌套调用,并在第二次操作失败时处理错误。这意味着,如果 Cloud Storage 中的上传操作失败,您必须从 Firestore 中删除文档,反之亦然。

但请注意,在某个时间点,会出现客户端无法回滚删除操作之一的故障。对于这些可能发生的不可避免的故障,最常见的方法是通过在 Firestore 和 Firebase 存储这两个地方处理异常和执行偶尔的清理来使您的代码更加健壮。

【讨论】:

【参考方案2】:

您可以设置用户身份验证声明,例如“can_upload_pics”,然后在用户启动上传时检查此声明,您可能希望使用 firebase 函数添加自定义声明。如果做得对,第二个选项将按预期工作 查看此视频以获取 custom claims 的良好解释和示例

【讨论】:

以上是关于Firebase 上传保护的主要内容,如果未能解决你的问题,请参考以下文章

在没有 Firebase 身份验证的情况下保护 Firebase 数据库

Firebase 托管 - 密码保护网站?

firebase 中受保护内容的适当授权规则

保护 Firebase Cloud Function HTTP 端点

Firebase 身份验证和实时应用程序数据库如何保护自身?

如何在客户端保护 Firebase 身份验证? [复制]