Firebase函数写入Cloud Storage遇权限错误,如何仅授权函数读写?
我在console.cloud.google.com/logs中看到如下错误:
ERROR: "_baseMessage: "Firebase Storage: User does not have permission to access '[my_file_name_here]'
我原本以为Firebase函数拥有管理员权限,能不受限制操作Firestore和Firebase Storage数据,但实际并非如此。会不会是因为操作的是Storage而非Firestore?
当Storage读写权限设为允许所有人时,Firebase函数可以成功写入;但把规则设为if false;或if request.auth != null;时,函数写入失败。
我不想开放读写权限给所有人,请问有没有办法仅授权Firebase函数对Storage进行读写操作?当前的Storage规则如下:
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if false; } } }
解决方法
Firebase函数默认的服务端身份不会被Storage安全规则自动识别,想要仅授权函数访问,有两种可行方案:
方案一:用Google Cloud Storage服务端SDK绕过安全规则
直接使用Google Cloud Storage的服务端SDK(而非Firebase客户端SDK)操作存储,这种方式会跳过Storage安全规则,因为服务账号本身拥有项目管理员权限。
Node.js示例代码:
const { Storage } = require('@google-cloud/storage'); const storage = new Storage(); const bucket = storage.bucket('你的存储桶名称'); // 上传文件示例 async function uploadToStorage() { await bucket.upload('本地文件路径', { destination: '存储桶内文件路径', }); }
方案二:在安全规则中验证服务账号身份
如果你想通过规则严格限制访问,可以验证请求来自你的项目服务账号:
- 从Firebase控制台「项目设置」→「服务账号」中获取你的服务账号邮箱。
- 修改Storage规则,添加身份验证逻辑:
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth.token.email == "你的服务账号邮箱@项目ID.iam.gserviceaccount.com"; } } }
注意:使用这种方式时,函数需要通过服务账号身份发起请求,确保携带正确的身份令牌。
另外需要明确:Firebase Admin SDK操作Firestore、Auth时会自动绕过安全规则,但调用Firebase Storage客户端SDK时仍受规则限制——只有用Google Cloud服务端SDK或在规则中授权服务账号,才能实现函数的专属访问权限。
内容的提问来源于stack exchange,提问作者Shawn Ashton

