基于Node.js开发复杂Web应用:Firebase及Cloud Function技术咨询
很高兴结合实际开发经验来帮你梳理这些问题:
Q1:Firestore是否完全安全?我有使用firebase realtime database的经验,但在firebase realtime database中,用户登录后几乎拥有相同权限,这是严重的安全问题。
Firestore不是默认就完全安全的,但它的安全规则系统比Realtime Database更灵活、精细——你之前遇到的Realtime Database权限问题,本质是没有配置合适的安全规则导致的。
默认情况下,Firestore的规则是禁止所有读写操作的(测试阶段可能会临时改成允许所有,但上线前一定要调整回来)。你可以通过规则精确控制权限:
- 限制用户只能读写自己创建的文档(比如通过
request.auth.uid匹配文档中的用户ID字段) - 给不同角色的用户分配差异化权限(比如只有标记为管理员的用户才能修改特定集合)
- 基于文档内容做校验(比如禁止修改已发布的文章状态)
只要配置得当,Firestore可以做到非常安全,完全能避免你之前遇到的“用户登录后权限一致”的问题。
Q2:上述安全问题能否通过使用google cloud function解决?
当然可以,而且Cloud Functions是处理复杂权限/业务逻辑的绝佳补充方案。
如果有些逻辑没法用Firestore安全规则实现(比如跨多个文档的权限校验、需要调用第三方API验证数据、或者涉及复杂的计算逻辑),你可以让客户端不直接访问Firestore,而是调用Cloud Functions,在Functions里完成:
- 用Firebase Admin SDK验证用户的身份和权限
- 执行你需要的业务逻辑
- 再由Functions去操作Firestore
这种模式下,所有数据库操作都经过你的Functions层管控,能彻底解决权限问题。不过也要注意,Functions本身的权限配置要做好,比如限制只有认证用户才能调用特定函数。
Q3:在google cloud function中能否实现任意逻辑,比如引入(require)任意外部库?与独立nodejs服务器相比,google cloud function存在哪些限制?
关于外部库
Cloud Functions的Node.js环境支持require绝大多数npm包,只要这个包能在Node.js环境下运行(比如你常用的axios、lodash、moment这些都没问题)。不过要注意:
- 避免引入体积过大的包,否则会增加函数的冷启动时间
- 有些依赖底层系统库的包可能需要额外配置(比如涉及图形处理的包,可能需要在Functions中启用对应的运行时依赖)
和独立Node.js服务器的主要限制
- 执行时间限制:HTTP触发的函数最大超时时间是9分钟,事件触发的函数(比如Firestore触发器)最大也是540秒(9分钟),而独立服务器可以长时间运行后台任务
- 资源限制:函数的内存和CPU是配置好的(范围128MB-8GB),没法像独立服务器那样自由扩容硬件
- 冷启动问题:如果函数长时间没有被调用,第一次触发时会有几秒的启动延迟,独立服务器则一直保持运行状态
- 临时文件系统:只能在
/tmp目录写入临时文件,函数重启后这些文件会被清除,独立服务器可以使用持久化存储 - 无自定义端口/后台进程:函数是事件驱动的,不能监听自定义端口,也不适合运行长期后台进程(比如WebSocket服务)
Q4(可能与主题无关):我是否应该设计依赖firebase authentication的应用?这意味着应用需调用Firebase API验证用户凭证,客户端网页需加载Firebase SDK,这在性能和扩展性方面是否为良好实践?
非常推荐依赖Firebase Auth,这在性能和扩展性上都是极佳的实践,理由如下:
- 开发效率极高:不用自己维护用户数据库、处理OAuth 2.0流程(谷歌、脸书、推特这些登录都是现成的),几行代码就能实现完整的登录/注册流程
- 性能优化空间大:Firebase SDK支持按需加载(比如只加载
auth模块,而不是整个Firebase包),也可以用动态导入减少初始加载时间;另外Firebase的CDN遍布全球,加载速度很快 - 扩展性强:Firebase Auth是完全托管的服务,谷歌会负责处理高并发、安全补丁、用户数据存储等问题,你不用操心服务器扩容的问题
- 安全可靠:客户端获取的ID Token可以在后端(比如Cloud Functions)用Admin SDK快速验证,避免伪造身份的问题
唯一需要考虑的是,如果未来你想完全脱离Firebase生态,可能需要做一些适配工作,但从绝大多数项目的实际情况来看,Firebase Auth带来的便利性远大于这点潜在的迁移成本。
内容的提问来源于stack exchange,提问作者Sang

