如何通过 Cloud Functions 将文件上传到 Cloud Storage 并使用 Firestore 控制对 Cloud Storage 的访问?

Posted

技术标签:

【中文标题】如何通过 Cloud Functions 将文件上传到 Cloud Storage 并使用 Firestore 控制对 Cloud Storage 的访问?【英文标题】:How can I upload files to Cloud Storage through Cloud Functions and use Firestore to control access to Cloud Storage? 【发布时间】:2021-04-07 12:15:27 【问题描述】:

我正在尝试实现一个系统,该系统允许 react-native 客户端将文件上传到 Cloud Storage 中的特定文件夹并允许客户端从中下载。我不能直接从客户端执行此操作,因为我首先需要查询 Firestore 以验证用户是否是文件夹所有者的“朋友”,这将允许读/写权限。

我决定使用 Cloud Functions 作为中间层来封装这个业务逻辑,我希望也能够使用它作为中间层来上传文件。但是,我觉得我可能误解了如何最好地结合使用这些服务来解决这个问题。

当前计划:

    客户端将文件上传到 Cloud Function(假设在 Cloud Function 查询 Firestore 并验证后允许上传文件) Cloud Function 将文件上传到 Cloud Storage 然后客户端可以从 Cloud Function 请求文件,该函数使用 Firestore 验证权限并从 CloudStorage 下载文件 云函数向客户端发送文件

问题:

我可以/应该以这种方式使用 Cloud Functions 作为中间层在 Firestore 中验证权限存储后上传文件吗? 是否有使用 Firebase 的替代解决方案可以减轻 Cloud Functions 的 10MB 下载限制,但仍允许我使用我在 Firestore 中关系的自定义业务逻辑对上传/下载到 Cloud Storage 进行身份验证?

感谢您提供任何帮助或指导!我对 Firebase、云架构和一般架构非常陌生。

【问题讨论】:

【参考方案1】:

这绝对是一种有效且技术上可行的方法。你是否应该这样做,当然只有你自己可以决定。

另一种方法是使用 Firebase 存储的安全规则对文件实施访问控制。但是您将无法在这些规则中从 Firestore 读取任何内容,因此您必须确保授予/拒绝访问所需的所有内容都位于请求文件的路径、文件的元数据和/或用户的令牌。

即使您在 Cloud Functions 中实现文件下载,您仍然可以通过 Firebase 执行上传。例如,在这种情况下,您可以让用户写入一个临时位置,然后触发一个云函数,该函数可以对文件进行任何您想要的额外检查。

【讨论】:

感谢您的回复!很高兴听到我的方法并没有完全关闭!我对这种方法的一个担忧是,它实际上使给定文件的下载/上传次数增加了一倍,我认为这将导致通过 Cloud Function 从云存储上传和下载的延迟更长。这种方法只是预期的吗?还是有一些我不知道的解决方案? 还会有一次往返,但很难衡量其影响。我建议测量客户端上的时间差异。我期望绝大多数人将字节发送到用户的手机,而不是在相关服务器甚至数据中心之间穿梭。但再说一遍:我建议您对它进行端到端测量以确定。

以上是关于如何通过 Cloud Functions 将文件上传到 Cloud Storage 并使用 Firestore 控制对 Cloud Storage 的访问?的主要内容,如果未能解决你的问题,请参考以下文章

我们不能在 Firebase Cloud Functions 中写入多个文件吗

如何通过 Firebase Cloud Functions 上的 .firebaserc 切换到另一个 serviceAccountKey.json?

如何将 discord.js 机器人部署到 Cloud Functions?

如何从 Cloud Function 调用其他 Cloud Firebase Functions

如何在 Angular 组件中正确使用 Cloud Functions?

如何将应用环境变量用于 Firebase Cloud Functions?