firebase - 如何根据用户auth uid授予对Google云存储桶的访问权限

标签 firebase flutter google-cloud-firestore google-cloud-functions google-cloud-storage

我正在运行一个云函数来保存这样的图像:

//Pseudocode
const admin = await import("firebase-admin");
const bucket = admin.storage().bucket();
const file = bucket.file('myName');
const stream = file.createWriteStream({ resumable: false });
...

图片上传后,我得到了这样的publicUrl

file.publicUrl()

并将其存储在对象中。

然后该对象被存储到 firestore。

当我现在从对象复制这个 url 时(url 结构如下所示) https://storage.googleapis.com/new-project.appspot.com/ZWHpYGSQWYXLlUcAwkRFQLC0u7s1/f2a48bdc-7eb3-4174-9f6e-3fd963003bd7/177373254.png

并将其粘贴到浏览器字段中时出现错误:

<Error>
  <Code>AccessDenied</Code>
  <Message>Access denied.</Message>
  <Details>Anonymous caller does not have storage.objects.get access to the Google Cloud Storage 
  object.</Details>
</Error>

即使有测试规则:

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

我在 stackoverflow 上阅读了一些问题,这似乎是因为我使用的是 google 云存储桶而不是 firebase 存储桶(我认为它们是相同的)

但我对在这种情况下如何编写规则感到非常困惑,这样只有经过身份验证的 Firebase 用户才能读取文件。

非常感谢任何帮助。

最佳答案

Firebase 和 Cloud Storage 共享存储桶,但访问存储桶的方式却截然不同。

当您通过 Firebase SDK 或通过 Firebase SDK 生成的下载网址访问存储桶时,您的访问将通过 Firebase 层进行。该层强制执行安全规则(针对 SDK),并授予对下载 URL 的临时只读访问权限。

当您通过 Cloud SDK 或 Cloud SDK 生成的签名网址访问存储桶时,您的访问不会经过任何 Firebase 层,因此 Firebase 安全规则不会影响此访问。

您拥有的公共(public) URL 只是识别 Cloud Storage 存储分区中文件的一种方式。它没有任何隐含的访问权限。您需要确保存储桶的 IAM 属性允许您希望用户拥有该文件的访问权限。

关于firebase - 如何根据用户auth uid授予对Google云存储桶的访问权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71026323/

相关文章:

flutter - 在 flutter 中将数据持久化/存储在 GetXController 中的正确方法

flutter - 如何本地化 BottomNavigationBarItem 标签

android - 更新 Firestore 文档时出现 Coroutine JobCancellationException

node.js - 请求外部网络资源! - 来自 firebase 模拟器的日志错误

ios - Swift iOS 14 Firebase 警告——这个旧式函数定义之前没有原型(prototype)

javascript - 如何确定 Firestore 快照是否来自服务器?

android - 从 Flutter 应用程序连接到本地 Firebase 函数模拟器时出错

javascript - 如何在等待时遍历 Firestore 快照文档

android - "removeEventListener"(android) 是否关闭 Firebase 实时数据库连接?

firebase - 错误 : package com. google.firebase.messaging 不存在