Firebase Storage权限持续被拒绝问题排查求助
排查Firebase Storage 403权限拒绝问题
问题详情
当前Firebase Storage规则
rules_version = '2'; // Craft rules based on data in your Firestore database // allow write: if firestore.get( // /databases/(default)/documents/users/$(request.auth.uid)).data.isAdmin; service firebase.storage { match /b/{bucket}/o { match /user/{userId}/{allPaths=**} { allow read,write: if request.auth.uid == userId; } } }
Python上传代码
self.storage.child(self.uid + '/'+fNameonServer+'.png').put(self.path_here + '/dummy.png')
错误信息
File "C:\Users\bboyc\PycharmProjects\turtle\.venv\turtle_main.py", line 1140, in uploadImage self.storage.child(self.uid + '/'+fNameonServer+'.png').put(self.path_here + '/dummy.png') File "C:\Users\bboyc\PycharmProjects\turtle\.venv\lib\site-packages\pyrebaselite\pyrebaselite.py", line 464, in put raise_detailed_error(request_object) File "C:\Users\bboyc\PycharmProjects\turtle\.venv\lib\site-packages\pyrebaselite\pyrebaselite.py", line 511, in raise_detailed_error raise HTTPError(e, request_object.text) requests.exceptions.HTTPError: [Errno 403 Client Error: Forbidden for url: https://firebasestorage.googleapis.com/v0/b/jost-19f5e.appspot.com/o?name=lKIp1f9k05RmwP6CRWo6qT2Bcir1/imgJustice.png] { "error": { "code": 403, "message": "Permission denied." } }
用户说明:此前基于日期的存储规则下代码可正常运行,现在即使设置无限制规则也无法工作,目标是配置仅登录用户可访问的存储规则。
排查步骤
1. 修正存储路径匹配问题
你的规则要求文件必须放在/user/{userId}/路径下,但上传代码直接使用{uid}/文件名,缺少了user前缀,导致规则不匹配触发403。
解决方法:修改上传代码添加user/前缀:
self.storage.child('user/' + self.uid + '/' + fNameonServer + '.png').put(self.path_here + '/dummy.png')
或者调整规则去掉user前缀(不推荐,路径结构不够规范):
match /{userId}/{allPaths=**} { allow read,write: if request.auth.uid == userId; }
2. 确认用户已完成认证
pyrebaselite需要确保当前用户已登录,否则request.auth.uid为空,规则验证失败。检查上传操作是否在登录完成后执行,确认self.uid是当前登录用户的有效UID。
可以在上传前添加调试代码验证:
print("当前用户UID:", self.uid) print("是否已认证:", self.auth.current_user is not None)
3. 等待规则生效延迟
Firebase规则修改后可能需要2-3分钟全局同步,修改规则后等待一段时间再测试,避免因规则未生效导致的权限问题。
4. 手动传递认证令牌
部分轻量Firebase库可能存在认证信息未自动传递的问题,尝试在put方法中手动传入用户ID令牌:
user = self.auth.current_user token = user['idToken'] self.storage.child('user/' + self.uid + '/' + fNameonServer + '.png').put( self.path_here + '/dummy.png', token=token )
5. 测试无限制规则排查基础问题
临时设置完全开放的规则(测试后立即改回):
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if true; } } }
如果此时仍报错,说明问题不在规则,而是代码或库配置问题,比如Storage桶名称错误、API密钥配置错误等。
内容的提问来源于stack exchange,提问作者MooNChilD Song
相关产品推荐
相关产品推荐

