Firebase Storage安全规则疑问:未认证用户仍可通过下载链接访问文件
解决Firebase Storage规则无法限制未认证用户下载的问题
我之前也碰到过一模一样的问题,折腾了好一阵才找到根源,咱们一步步排查解决:
一、先确认规则是否真的生效了
很多时候问题出在规则没发布——你修改了规则但忘了点控制台右上角的「发布」按钮,旧规则还在生效。先检查你的规则是不是标准的结构(虽然你的写法也能工作,但标准结构更不容易出路径匹配问题):
service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read: if request.auth != null; // 如果需要限制上传的话,加上下面这行 // allow write: if request.auth != null; } } }
修改后一定要点击「发布」,等控制台提示规则更新成功再测试。
二、排查你用的下载链接是不是带临时权限的
如果你的下载链接是之前生成的签名URL(比如通过Admin SDK或者控制台手动生成的临时链接),这类链接自带有效期(默认1小时),在有效期内不管有没有认证都能访问。要测试真实的规则限制,你需要:
- 等旧的签名URL过期(或者直接生成一个新的、不带签名的基础链接)
- 用基础链接测试:
https://firebasestorage.googleapis.com/v0/b/你的存储桶ID/o/文件名?alt=media
这个链接会直接触发Storage规则检查,未认证用户访问应该返回403错误。
三、检查文件有没有被设置了公开ACL权限
如果之前你手动给文件设置过公开访问权限(比如在控制台给文件加了allUsers的读权限),ACL会优先于Storage规则生效,这时候规则就形同虚设了。解决方法:
- 打开Firebase控制台的Storage页面,找到对应的文件
- 点击文件右侧的「更多」→「权限」
- 删除所有包含
allUsers或未指定具体用户/角色的公开权限条目
四、正确的测试步骤
按这个流程测试才能确保结果准确:
- 退出所有Google账号,打开Chrome隐身模式
- 清空浏览器缓存(避免残留的认证信息)
- 访问文件的基础下载链接(不带任何签名参数)
- 如果规则生效,会直接返回403 Forbidden的错误
额外调试技巧
如果还是不行,可以给规则加个调试日志,看看请求的认证状态:
service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read: if request.auth != null && debug(request.auth); } } }
然后去Firebase控制台的「Storage」→「规则」→「监控」里查看请求的日志,就能看到这个请求有没有携带认证信息,方便定位问题。
内容的提问来源于stack exchange,提问作者atreeon
相关产品推荐
相关产品推荐

