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

如何调试Google Identity Platform自定义声明无法通过Firebase存储规则验证?

调试Firebase Storage权限拒绝问题

我为Firebase Storage配置了以下规则:

rules_version = '2';

service firebase.storage {
  match /b/{bucket}/o {
    allow write: if request.auth.token.role == "admin";
  }
}

通过以下Node.js代码,已验证目标UID具备admin角色:

const admin = require('firebase-admin');

const serviceAccount = require('./key-file.json');

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  projectId: "some-project-id",
});


const uid = 'my-uid';

admin.auth().getUser(uid)
  .then((userRecord) => {
    console.log(userRecord.customClaims);
  });

示例输出:

{ role: 'admin' }

但我的Dart客户端尝试上传文件时,收到权限拒绝提示。上传代码如下:

print('Current UID: ${FirebaseAuth.instance.currentUser?.uid}');
final testFileContent = Uint8List.fromList('This is a test file'.codeUnits);
FirebaseStorage.instance.ref().child('test.txt').putData(testFileContent);

日志信息:

I/flutter ( 7630): Current UID: X2vSwXi5PIeOWkQOCmXxvzqTPem2
E/StorageException( 7630): StorageException has occurred.
E/StorageException( 7630): User does not have permission to access this object.

我已完成的常规排查步骤:

  • 确认项目ID正确
  • 确认存储桶正确(仅存在一个存储桶)
  • 等待自定义声明传播超过1小时
  • 登出并重新登录

额外调试建议

  1. 在客户端验证自定义声明:在Dart代码中获取当前用户的ID Token并解析,确认role声明是否存在。示例代码:
final idTokenResult = await FirebaseAuth.instance.currentUser?.getIdTokenResult();
print('Custom claims: ${idTokenResult?.claims}');

如果输出中没有role: 'admin',说明客户端的Token未更新,可尝试强制刷新Token:

await FirebaseAuth.instance.currentUser?.getIdToken(true);
  1. 临时放宽规则测试:修改Storage规则,先允许该特定UID写入,验证是否能成功上传,以此排除声明以外的问题:
rules_version = '2';

service firebase.storage {
  match /b/{bucket}/o {
    allow write: if request.auth.uid == "X2vSwXi5PIeOWkQOCmXxvzqTPem2";
  }
}

如果上传成功,说明问题出在自定义声明的传递或规则判断上;如果还是失败,检查客户端Auth状态是否正常、存储桶是否匹配。

  1. 检查规则匹配范围:当前规则匹配的是存储桶下的所有对象,但如果上传路径有特殊结构,可尝试明确指定路径测试,比如:
rules_version = '2';

service firebase.storage {
  match /b/{bucket}/o {
    match /test.txt {
      allow write: if request.auth.token.role == "admin";
    }
  }
}
  1. 启用Firebase Auth调试日志:在Dart客户端开启Auth调试日志,查看Token获取和验证过程是否有异常:
FirebaseAuth.instance.setLoggingEnabled(true);

内容的提问来源于stack exchange,提问作者Dr-Bracket

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:10:14