You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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步骤

  1. 调用Admin SDK的setCustomUserClaims方法更新指定用户的声明,参数分别对应用户UID、要设置的声明对象:
// 示例:将UID为test-user-123的用户的allowAccess声明设为false,模拟云函数执行后的效果
await admin.auth().setCustomUserClaims("test-user-123", {
  allowAccess: false,
  role: "normal",
  // 其他需要模拟的声明字段
});
  1. 如果是客户端侧测试,需要强制刷新用户的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 03:15:10