Firebase 存储安全规则 400 错误问题“权限被拒绝。无法访问存储桶 xxxxx-****.appspot.com”

Posted

技术标签:

【中文标题】Firebase 存储安全规则 400 错误问题“权限被拒绝。无法访问存储桶 xxxxx-****.appspot.com”【英文标题】:Firebase storage security rules 400 error issue "Permission denied. Could not access bucket 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 仍然没有成功

【问题讨论】:

【参考方案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:无法评论接受的答案,因为我没有足够的代表。

【讨论】:

以上是关于Firebase 存储安全规则 400 错误问题“权限被拒绝。无法访问存储桶 xxxxx-****.appspot.com”的主要内容,如果未能解决你的问题,请参考以下文章

读取 Firebase 存储映像安全规则

在 React Native 中将图像上传到 Firebase 存储时出现错误 400 Bad Request

Firebase 存储安全规则

群组的 Firebase 存储安全规则

为特定用户提供访问权限的 Firebase 存储安全规则

Firebase 存储安全规则,允许公共或所有者私有文件访问