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

Firebase Storage出现storage/unauthorized 403错误的解决请求

解决Firebase Storage 403(storage/unauthorized)错误

向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权限拦截。

解决步骤:

  1. 添加Firebase Auth依赖
    由于使用的是Firebase 8.x版本,需要补充引入认证模块:

    <script src="https://www.gstatic.com/firebasejs/8.3.0/firebase-auth.js"></script>
    
  2. 实现用户认证逻辑
    根据业务场景选择合适的认证方式,以下是两种常见实现:

    • 匿名登录(适合无需用户注册的场景):

      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));
      
  3. 监听认证状态(可选但推荐)
    添加认证状态监听,确保只有用户登录后才执行存储操作:

    firebase.auth().onAuthStateChanged((user) => {
      if (user) {
        // 用户已登录,执行存储操作
        console.log("当前登录用户:", user.uid);
        // ... 你的删除、上传逻辑
      } else {
        // 用户未登录,提示或引导登录
        console.log("请先登录");
      }
    });
    

额外排查点:

  • 登录Firebase控制台,在「Authentication」-「登录方法」中确认已启用对应的认证方式(比如匿名登录需要手动开启)。
  • 检查「Storage」-「规则」页面,确保修改后的规则已点击「发布」按钮生效。

内容的提问来源于stack exchange,提问作者a hmed.gamer_1_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 12:05:59