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
相关产品推荐
相关产品推荐

