仅允许对 Cloud Functions for Firebase 进行写访问

Allowing write access only to Cloud Functions for Firebase

我们如何通过仅允许 Cloud Functions for Firebase 将数据写入特定位置的规则来保护数据库,之前有一个选项可以将 uid 添加到管理客户端 databaseAuthVariableOverride 并在规则部分使用该 uid ,但现在我们通过 admin.initializeApp(functions.config().firebase); 进行初始化,所以我不确定如何在其中添加额外的参数。

编辑 为此用证书启动是个好主意吗?即

admin.initializeApp({
  credential: admin.credential.cert("/path-to-cert"),
  databaseURL: "database-url",
  databaseAuthVariableOverride: { uid: "some-id" }
});

admin.initializeApp(functions.config().firebase)比上面有什么好处,functions.config()实际上从哪里获取数据,这不只是一个节点模块吗?

通常,在您的 Cloud Functions 代码的顶部,您有:

var functions = require('firebase-functions');

作为 firebase-functions 节点模块的一部分,您可以访问 functions.config().firebase 这只是一个对象,其中包含初始化 Admin SDK 所需的一切,包括您的数据库 URL 和凭证实现(基于应用程序默认凭证)。如果您 console.log(functions.config().firebase) 在您的代码中,您会看到它只是一个具有这些属性和您可能想在代码中使用的其他一些属性的对象。

您可以添加 databaseAuthVariableOverride to this object to limit the Admin SDK's privileges。您可以只覆盖对象本身:

var firebaseConfig = functions.config().firebase;
firebaseConfig.databaseAuthVariableOverride = {
  uid: 'some-uid',
  foo: true,
  bar: false
};
admin.initializeApp(firebaseConfig);

或者您可以使用 Object.assign() 之类的方法将相关详细信息复制到新对象:

var firebaseConfig = Object.assign({}, functions.config().firebase, {
  databaseAuthVariableOverride: {
    uid: 'some-uid',
    foo: true,
    bar: false
  }
});
admin.initializeApp(firebaseConfig);