Firebase函数管理sdk获取云存储对象的下载url:权限被拒绝
我目前在云存储上设置了图像。因为我需要通过Google Cloud Node.js客户端库来访问这些,所以上面的代码是我当前的设置。不幸的是,在运行此代码时,出现以下错误: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")
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;
}
}
}