Firebase Storage出现storage/unauthorized 403错误的解决请求
向Firebase Storage写入/删除数据时频繁触发storage/unauthorized 403错误,排查后怀疑核心原因是安全规则中的request.auth始终为null。
当前配置信息
Firebase Storage安全规则
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } }
前端JavaScript代码
const firebaseConfig = { apiKey: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", authDomain: "xxxxxxxxxxxx.firebaseapp.com", projectId: "xxxxxxxxxxx", storageBucket: "xxxxxxxxxxxx.appspot.com", messagingSenderId: "xxxxxxxxxxxxxxx", appId: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", measurementId: "G-xxxxxxxxxxxxxxxx" }; firebase.initializeApp(firebaseConfig); var fileName = "m10pl"; var storage = firebase.storage(); var fileRef = storage.ref().child("Images/" + fileName + ".jpg"); fileRef.delete() .then(() => { console.log("Deleted"); }) .catch((error) => { console.error("fix it ", error); }); let storageRef = firebase.storage().ref("Images/" + fileName + ".jpg"); let uploadTask = storageRef.put(fileItem); uploadTask.on("state_changed",(snapshot)=>{ percentval = parseInt(Math.floor((snapshot.bytesTransferred/snapshot.totalBytes) *100)); $("p.work____").html("Please Wait... (Dont Close Browser) " + percentval + "%"); console.log(snapshot); },(error)=>{ console.log(error); },()=>{ uploadTask.snapshot.ref.getDownloadURL().then((url)=>{ console.log(`URL ${url}`); url = url.replaceAll("&","%26"); var t = "m"; var uid = 10; $.ajax({ url:"/console/system.php", type:"post", data:`app_resource=icon&res_t=${t}&res_uid=${uid}&url=${url}`, success:function(respone){ $("p.work____").html(""); console.log(respone); if(respone == "success"){ $("p.sucs____").html("The icon has been uploaded successfully"); }else{ $("p.error____").html(respone); } } }) }) }) }
引入的Firebase版本
<script src="https://www.gstatic.com/firebasejs/8.3.0/firebase.js"></script> <script src="https://www.gstatic.com/firebasejs/8.3.0/firebase-storage.js"></script>
问题根源与解决方案
你的安全规则明确要求所有读写操作必须在用户已认证(request.auth != null)的前提下进行,但当前代码完全没有实现用户认证逻辑,Firebase无法识别请求发起者的身份,导致request.auth始终为null,触发403权限拦截。
解决步骤:
添加Firebase Auth依赖
由于使用的是Firebase 8.x版本,需要补充引入认证模块:<script src="https://www.gstatic.com/firebasejs/8.3.0/firebase-auth.js"></script>实现用户认证逻辑
根据业务场景选择合适的认证方式,以下是两种常见实现:匿名登录(适合无需用户注册的场景):
firebase.initializeApp(firebaseConfig); // 先完成匿名登录,再执行存储操作 firebase.auth().signInAnonymously() .then(() => { // 登录成功后执行删除、上传逻辑 var fileName = "m10pl"; var storage = firebase.storage(); var fileRef = storage.ref().child("Images/" + fileName + ".jpg"); fileRef.delete() .then(() => console.log("Deleted")) .catch((error) => console.error("删除失败:", error)); let storageRef = firebase.storage().ref("Images/" + fileName + ".jpg"); let uploadTask = storageRef.put(fileItem); // 后续上传逻辑保持不变 }) .catch((error) => console.error("匿名登录失败:", error));邮箱密码登录(适合需要用户账号的场景):
firebase.initializeApp(firebaseConfig); // 替换为实际的邮箱和密码 const email = "user@example.com"; const password = "userpassword"; firebase.auth().signInWithEmailAndPassword(email, password) .then((userCredential) => { console.log("登录成功,用户UID:", userCredential.user.uid); // 执行存储操作 // ... 你的删除、上传逻辑 }) .catch((error) => console.error("登录错误:", error.code, error.message));
监听认证状态(可选但推荐)
添加认证状态监听,确保只有用户登录后才执行存储操作:firebase.auth().onAuthStateChanged((user) => { if (user) { // 用户已登录,执行存储操作 console.log("当前登录用户:", user.uid); // ... 你的删除、上传逻辑 } else { // 用户未登录,提示或引导登录 console.log("请先登录"); } });
额外排查点:
- 登录Firebase控制台,在「Authentication」-「登录方法」中确认已启用对应的认证方式(比如匿名登录需要手动开启)。
- 检查「Storage」-「规则」页面,确保修改后的规则已点击「发布」按钮生效。
内容的提问来源于stack exchange,提问作者a hmed.gamer_1_
相关产品推荐
相关产品推荐

