一些 Firebase 安全规则适用于 Cloud Functions 中的管理员

Some Firebase security rules apply for admin in Cloud Functions

Cloud Function 在更新或删除时出现 firebase 权限被拒绝的错误。

服务帐户已使用文件中的凭据进行初始化,以便使用 auth.createCustomToken 当前不可用于默认帐户

admin = require('firebase-admin');
functions = require('firebase-functions');
credential = admin.credential.cert(require('./credentials.json'));
admin.initializeApp({credential: credential, databaseURL: functions.config().firebase.databaseURL});

阻止更新的安全规则:

"downloads": {
  "$key": {
    ".write": "data.val() == null"
  }
}

用户将带有 push 的数据插入 /downloads,然后 Cloud Function 尝试更新并随后删除。即使管理员帐户应该绕过包括验证在内的所有安全规则,这两个操作都会失败。

FIREBASE WARNING: update at /downloads/-Kexz33ljYjKblF_ZgUo failed: permission_denied
FIREBASE WARNING: set at /downloads/-Kexz33ljYjKblF_ZgUo failed: permission_denied

如果我将规则更改为这样,第一个错误(更新)就会消失:

"downloads": {
  "$key": {
    ".write": "newData.child('uid').val() == auth.uid"
  }
}

更新

解决方法是将 event.data.ref 重新定义为

ref = admin.database().ref(event.data.ref.path.toString())

event.data object returned to your Cloud Function's onWrite() callback, there are two types of Database references: one that is scoped to to the same permissions as the user who triggered the write (event.data.ref) and one that is scoped with admin rights, granting full read and write access (event.data.adminRef)。我无法判断,因为您没有提供显示您的 Cloud Function 的代码示例,但我敢打赌您正在使用 event.data.ref。改用 event.data.adminRef 应该可以解决您的问题。