在线测试Firebase Cloud Functions时如何伪造身份认证
Firebase Cloud Functions HTTPS函数测试时Mock
context.auth 的实现方案 官方测试SDK本身就自带上下文构造能力,不需要额外引入第三方mock工具就能实现在线测试模式下的认证态模拟,不需要修改业务代码,具体方案分场景适配:
Callable类型HTTPS函数(直接读取context.auth的场景)
SDK的wrap方法支持传入第二个参数作为函数执行的上下文配置,直接在配置里传auth字段就能模拟任意uid的已认证用户:// 初始化测试SDK实例,绑定测试用Firebase项目 const fft = require('firebase-functions-test')(/* 测试项目配置 */, './test-service-account.json'); // 导入待测试的云函数 const { permissionControlledFunc } = require('../index'); // 包装待测试函数 const wrapped = fft.wrap(permissionControlledFunc); // 模拟uid为test_user_001的已认证用户发起调用 const authedRes = await wrapped( { /* 第一个参数传入请求携带的业务数据 */ }, { auth: { uid: 'test_user_001', token: { email_verified: true /* 可按需模拟自定义claim、token字段 */ } } } ); // 模拟未登录用户调用,不传auth配置即可 const unauthedRes = await wrapped({});要完整测试权限校验链路的话,只需要在调用函数前,通过测试SDK获取admin实例,往测试库Firestore里写入对应用户的权限文档,调用结束后清理测试数据避免环境污染即可。
onRequest类型HTTPS函数(从HTTP请求头解析身份的场景)
这类函数不直接接收context对象,而是从请求头的ID Token解析用户身份,两种模拟方式可选:- 用admin SDK的
createCustomToken方法为测试uid生成自定义token,构造请求时放到Authorization: Bearer <token>请求头中 - 直接调用测试SDK提供的
fft.exampleApp.makeJwt()方法快速生成测试用JWT,不需要走真实的token签发流程
- 用admin SDK的
轻量测试优化方案
如果觉得在线测试每次读写Firestore、构造完整上下文效率低,可以对业务逻辑做拆分:- 将认证状态校验、用户权限查询、权限匹配判断的逻辑抽成可单独导入的工具函数
- 单元测试阶段直接给这些工具函数传入mock的auth对象、mock的数据库返回结果,不需要依赖云函数运行时
- 只保留少量集成测试走完整的云函数触发+真实数据库读写流程,兼顾测试效率和覆盖度
注意:不要直接mock整个
firebase-functions模块或者手动篡改context原型,用官方SDK提供的上下文构造方法模拟的认证态,和线上真实运行时的行为完全一致,不会出现测试通过但线上报错的问题。
内容的提问来源于stack exchange,提问作者Joel Newman
相关产品推荐
相关产品推荐

