使用Firebase Emulators与@firebase/testing库如何更新用户自定义claims
Firebase Emulator 环境手动修改用户Custom Claim操作指南
前置配置
首先确保你的测试代码已经正确关联Auth模拟器,避免误操作线上环境:
// 测试代码开头添加,端口和你本地模拟器Auth服务端口保持一致,默认是9099 process.env.FIREBASE_AUTH_EMULATOR_HOST = "127.0.0.1:9099"; // 初始化Admin SDK,模拟器环境无需传入线上服务密钥 const admin = require("firebase-admin"); admin.initializeApp({ projectId: "你的模拟器项目ID" });
注意:项目ID要和启动模拟器时指定的ID完全一致,否则会出现权限错误
手动修改Custom Claim步骤
- 调用Admin SDK的
setCustomUserClaims方法更新指定用户的声明,参数分别对应用户UID、要设置的声明对象:
// 示例:将UID为test-user-123的用户的allowAccess声明设为false,模拟云函数执行后的效果 await admin.auth().setCustomUserClaims("test-user-123", { allowAccess: false, role: "normal", // 其他需要模拟的声明字段 });
- 如果是客户端侧测试,需要强制刷新用户的ID Token,因为客户端默认会缓存旧Token,不会自动携带更新后的声明:
// 客户端示例代码 const user = firebase.auth().currentUser; // 传true强制刷新Token const newIdToken = await user.getIdToken(true);
配合数据库权限测试的示例
以Firestore安全规则测试为例,假设你设置了如下规则:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /protected/{doc} { allow read, write: if request.auth != null && request.auth.token.allowAccess == true; } } }
你修改完用户allowAccess为false后,用该用户的身份发起访问请求,断言返回permission-denied错误即可完成测试。
注意事项
- 如果你使用Jest、Mocha等测试框架,可以将修改声明的逻辑封装到测试用例的
beforeEach/beforeAll钩子中,实现多测试用例复用 - 修改声明后如果直接使用Admin SDK访问数据库,不需要刷新Token,Admin SDK会直接读取最新的用户声明
内容的提问来源于stack exchange,提问作者Simon Tran
相关产品推荐
相关产品推荐

