Firebase函数管理sdk获取云存储对象的下载url:权限被拒绝

Firebase函数管理sdk获取云存储对象的下载url:权限被拒绝,firebase,google-cloud-functions,google-cloud-storage,firebase-admin,Firebase,Google Cloud Functions,Google Cloud Storage,Firebase Admin,我目前在云存储上设置了图像。因为我需要通过Google Cloud Node.js客户端库来访问这些,所以上面的代码是我当前的设置。不幸的是,在运行此代码时,出现以下错误: exports.test = functions.https.onRequest(async (req, res) => { const file = await admin .storage() .bucket("XXX") .file("YYY")

我目前在云存储上设置了图像。因为我需要通过Google Cloud Node.js客户端库来访问这些,所以上面的代码是我当前的设置。不幸的是,在运行此代码时,出现以下错误:

exports.test = functions.https.onRequest(async (req, res) => {
  const file = await admin
    .storage()
    .bucket("XXX")
    .file("YYY");
  await file.makePublic();
  const url = await file.publicUrl();
});
我有点困惑,因为以下来自()Firebase引用:

您可以在中使用AdminSDK返回的bucket引用 与官方的Google云存储客户端库一起 上载、下载和修改与关联的存储桶中的内容 你的Firebase项目。请注意,您不必进行身份验证 使用Firebase Admin SDK时使用Google云存储库。 管理员SDK返回的bucket引用已经使用用于初始化Firebase的凭据进行了身份验证 应用程序。

那我为什么要担心安全规则呢?更重要的是,我如何解决这个问题

如何初始化管理SDK:

{
  "error": {
    "code": 401,
    "message": "Anonymous caller does not have storage.objects.getIamPolicy access to the Google Cloud Storage object.",
    "errors": [
      {
        "message": "Anonymous caller does not have storage.objects.getIamPolicy access to the Google Cloud Storage object.",
        "domain": "global",
        "reason": "required",
        "locationType": "header",
        "location": "Authorization"
      }
    ]
  }
}
编辑:添加了安全规则和IAM角色。 我的安全规则:

const serviceAccount = require("./[my-project-name]-8a2aa8e3eedc.json");
admin.initializeApp({ credential: admin.credential.cert(serviceAccount) });

虽然Firebase Admin SDK不受存储规则的约束,但连接到运行代码的函数的服务帐户仍然需要具有IAM存储权限,这是两个独立的东西。确保该功能的服务帐户具有“存储对象管理员”IAM角色


另一方面,在试图重现该问题时,我发现方法
file.publicUrl()
当前不起作用,因此您需要使用
getSignedUrl
方法,顺便说一句,这是关于安全问题的推荐方法。或者(尽管非常不鼓励)您可以自己手工制作uri。

您是否可以添加存储安全规则?此外,云功能服务帐户是否具有任何IAM存储权限?@Happy Monad刚刚更新了这两个权限
rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o/images {
    match /listings/{listingId}/{photo} {
      allow read, write: if true;
    }
    match /users/{userId}/{photo} {
      allow read: if true;
      allow write: if request.auth.uid == userId;
    }
  }
}