【问题标题】:Firebase storage security rules 400 error issue "Permission denied. Could not access bucket xxxxx-****.appspot.com"Firebase 存储安全规则 400 错误问题“权限被拒绝。无法访问存储桶 xxxxx-****.appspot.com”
【发布时间】:2018-10-21 20:56:48
【问题描述】:

在尝试上传照片时,我不断收到来自 firebase 链接的消息错误,说我的 react 项目中的 firebase 存储上传出现 400 错误...之前一切正常并成功上传图片,但现在它停止上传照片给以下错误,我不知道问题出在哪里...

inspect中提示的链接

POST https://firebasestorage.googleapis.com/v0/b/xxxxx-****.appspot.com/o?name=usertemp%2F0rdrGK4MRDRptAMCc3mHDveytJv1%2F0rdrGK4MRDRptAMCc3mHDveytJv1.jpg 400 ()

这是来自链接响应的错误

{
  "error": {
    "code": 400,
    "message": "Permission denied. Could not access bucket xxxxx-****.appspot.com. Please enable Firebase Storage for your bucket by visiting the Storage tab in the Firebase Console and ensure that you have sufficient permission to properly provision resources."
  }

这是我的安全

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth!=null;
    }
  }
}

我仍然尝试将 match 更改为 /b/xxxxx-****.appspot.com/o 仍然没有成功

【问题讨论】:

    标签: firebase-storage firebase-security http-status-code-400


    【解决方案1】:

    这是由于缺少权限。你需要检查你是否有

    firebase-storage@system.gserviceaccount.com

    作为具有“存储管理员”角色的成员。如果您没有,请添加它。这将解决问题。

    这是有关如何检查和添加权限的步骤。

    • 转至Cloud console
    • 导航到存储
    • 选择您的存储桶,然后点击显示信息面板。

    如果需要,您还可以在 IAM & Admin 中添加缺少的权限。

    【讨论】:

    • 我刚刚按照您的解决方案解决了我的问题,但是您需要清楚地提及我们应该在面板中添加什么权限。就我而言,我只是与另一个健康的 firebase 项目进行比较,发现缺少的权限是 firebase-storage@system.gserviceaccount.com 需要具有存储管理员角色
    • 知道为什么这可以工作 6 个月并突然导致此错误吗?
    • @GünterZöchbauer 我也不知道。我认为最好询问firebase支持。我刚刚在他们的状态仪表板中看到了这一点status.firebase.google.com/incident/Storage/18003
    • 他们似乎改变了他们的规则.. 但是在他们的项目中触发此类错误之前没有通知开发人员太糟糕了,但是感谢 Goblin 在我在 2 天内与这个错误作斗争之后
    • 我也受到了这种随机变化的打击。天哪。幸运的是,多亏了谷歌和这个答案,我在 5 分钟内找到了答案。由于我只在其他人之后几天才注意到这一事实。向所有失去更多时间的人表示同情。
    【解决方案2】:

    当您在创建专用于文件上传的 Firebase 存储之前尝试上传图片时发生此错误。

    无法访问存储桶 xxxxx-****.appspot.com。请访问 Firebase 控制台中的“存储”选项卡为您的存储桶启用 Firebase 存储,并确保您有足够的权限来正确配置资源

    这就是您遇到消息 Please Enable Firebase Storage for your bucket 错误的原因,因为 Firebase 存储充当存储桶媒体上传的默认位置。

    {
      "error": {
        "code": 400,
        "message": "Permission denied. Could not access bucket xxxxx-****.appspot.com. Please enable Firebase Storage for your bucket by visiting the Storage tab in the Firebase Console and ensure that you have sufficient permission to properly provision resources."
      }
    

    怎么办?

    只需转到您的项目 Firebase 控制台 >> 存储 >> 并点击 开始使用

    【讨论】:

    • 这不是解决问题,我也按开始,仍然得到上面的错误。
    【解决方案3】:

    我已经通过转到Storage > Rules 并将read,write 设置为true 来解决这个问题:

    从这里:

    rules_version = '2';
    service firebase.storage {
      match /b/{bucket}/o {
        match /{allPaths=**} {
          allow read, write: if false; //set this to true
        }
      }
    }
    
    

    改成这样:

    rules_version = '2';
    service firebase.storage {
      match /b/{bucket}/o {
        match /{allPaths=**} {
          allow read, write: if true; // true
        }
      }
    }
    
    

    如果它不起作用,排除故障可能会有所帮助;尝试通过单击Upload File 按钮将image/file 上传到您的存储空间。并尝试从您的脚本/代码重新上传文件以查看它是否有效。然后删除您上传的示例文件。确保 allow read, write:true : allow read, write: if true;

    注意:这仅用于测试开发,稍后在生产中更改规则。

    【讨论】:

      【解决方案4】:

      我注意到这个问题发生在没有在 Google App Engine 仪表板上启用 Firebase* API 和服务的项目上(见下面的屏幕截图)。所以我手动启用了与 firebase 存储相关的 API。

      我不明白为什么某些项目会自动启用某些 API 和服务,而其他项目则不会。 Firebase - GCP integration steps 上似乎没有关于需要明确启用 firebase API 的具体说明。

      另一个SO thread 有助于阐明这种明显的不一致

      【讨论】:

        【解决方案5】:

        我遇到了同样的问题。解决方案是点击 Storage 标签(firebase 控制台左侧),然后点击 OK 按钮启用上传规则。

        【讨论】:

          【解决方案6】:

          我遇到了同样的问题。问题是,我在初始化存储之前托管了我的页面,所以当我初始化它时,存储桶不匹配。我所要做的就是在 firebase 上生成另一个 google-services.json 文件,下载它,将它添加到我的项目文件中,然后再次部署它。这解决了我的问题。

          【讨论】:

          • “在 firebase 上生成另一个脚本”是什么意思?
          • 嗨@StephenKaiser 我的意思是 google-services.json 文件。为了更清楚,我将编辑评论
          【解决方案7】:

          如果上述解决方案不起作用。检查给定的 StorageInstanceURL 是否正确。

          【讨论】:

            【解决方案8】:

            如果您在遵循此页面上的无数解决方案后遇到此问题,并且如果您最近将 Firebase 项目降级为免费版本,则可能需要确保您使用的是正确的存储桶。

            对我来说,我通过谷歌云控制台创建了一个存储桶。后来,我创建了一个 firebase 项目来使用我的统一应用程序中的存储。我将这个新存储桶添加到我的存储中,所以现在我有一个由 firebase 提供的默认存储桶和我之前创建的存储桶。我通过我的应用上传文件没有问题。

            但是,我随后更改为免费版本的 firebase,以避免任何意外账单。这样做的意外后果是,每个 Firebase 项目只能使用一个存储桶,并且不允许使用额外的存储桶。

            因此,请检查您是否尝试写入 firebase 提供的默认存储桶实例,而不是您创建的自定义存储桶。它仍然会说权限被拒绝,它仍然会告诉您确保启用了存储,即使您这样做了。现实情况是,如果您使用的是免费版本的 firebase,则需要使用默认存储桶。

            tldr:如果您使用的是免费版的 firebase,则不能使用自定义存储桶,必须使用 firebase 创建的默认存储桶。

            【讨论】:

              【解决方案9】:

              在我的情况下,firebase-adminsdk 权限缺失。我按照接受的答案并将firebase-adminsdk-xxxx@xxxxx.iam.gserviceaccount.com 添加到存储管理员角色中,如下所示:

              转到https://console.cloud.google.com/home/dashboard?project=your-project-name

              导航到存储 选择您的存储桶,然后点击显示信息面板。

              点击Add并输入firebase-adminsdk-,选择自动填充选项

              点击select role > cloud storage > storage admin 并保存。

              obs:无法评论接受的答案,因为我没有足够的代表。

              【讨论】:

                猜你喜欢
                • 2019-12-09
                • 2019-07-30
                • 1970-01-01
                • 2019-07-26
                • 2018-05-19
                • 1970-01-01
                • 1970-01-01
                • 2020-05-05
                相关资源
                最近更新 更多