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

Flutter客户端访问Firebase Storage媒体授权失败问题求助

Firebase Storage权限错误排查:沙箱验证通过但Flutter客户端访问失败

问题概述

在已完成用户认证且理论上具备权限的情况下,下载Firebase媒体资源时触发错误:[firebase_storage/unauthorized] 用户无权执行所需操作。。通过Firebase规则沙箱模拟相同读取操作时验证通过,但Flutter客户端实际执行时失败。

Firebase Storage安全规则

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {

    function isUserSubscribed(creatorId, postId){
      let monthlySub = firestore.exists(/databases/(default)/documents/us_user/$(creatorId)/subscribers/$(request.auth.uid));

      return (
        (request.auth != null && request.auth.uid != null && monthlySub)
      );
    }

    match /private/us_user/{creatorId}/{postId}/{allPaths=**} {
      allow read: if (isUserSubscribed(creatorId,postId));
      allow write, delete: if request.auth != null && request.auth.uid != null;
    }

  }
}

isUserSubscribed函数用于校验用户访问权限,逻辑为检查Firestore中us_user/{creatorId}/subscribers/{当前用户UID}文档是否存在。

关键上下文信息

  • 客户端请求路径:private/us_user/john_carter/c5e091ad-aaaa-429c-aaf8-3db18603a37a/e25090bcf0384d7f9094297a1c60a2f7
  • 当前已认证用户UID:ejao19bd1kn1baa3

Flutter客户端获取媒体数据代码

getImageData(String path) async {
    try {
    User? firebaseUser = FirebaseAuth.instance.currentUser;
    if (firebaseUser == null) {
      return;
    }

    print(firebaseUser.uid);
      await _firebaseStorage.ref().child(path).getData(100000000).then((data) {
        if (mounted) {
          setState(() {
            imageBytes = data;
            isUnlocked = true;
          });
          print(path);
        }
      }).onError((error, stackTrace) {
        if (error is FirebaseException) {
          if (error.message == "User is not authorized to perform the desired action.") {
            if (mounted) {
              setState(() {
                isUnlocked = true;
              });
            }
          }
        }
        log(error.toString());
        log(stackTrace.toString());
      });
    } catch (e) {
      if (e is FirebaseException) {
        log("fb ::: ${e.toString()}");
      }
      log(e.toString());
    }
  }

排查方向

  • Firestore文档与权限校验
    确认Firestore中us_user/john_carter/subscribers/ejao19bd1kn1baa3文档真实存在,路径、UID拼写完全匹配;同时检查Firestore安全规则是否允许Storage服务账号读取该文档路径。
  • 客户端认证状态
    确认客户端打印的UID为ejao19bd1kn1baa3,用户会话未过期;可尝试调用await firebaseUser.getIdToken(true)强制刷新认证令牌后再发起请求。
  • 路径匹配一致性
    核对客户端传入的path参数与规则中match路径完全一致,无多余前缀/后缀、大小写错误或特殊字符问题。
  • 规则部署状态
    确认当前生效的Storage规则为最新部署版本,无旧规则残留。

内容的提问来源于stack exchange,提问作者ANURAG VERMA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 16:23:18