只允许Cloud Functions for Firebase具有写入访问权限

6

我们如何通过规则来保护数据库,只允许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" }
});
< p > admin.initializeApp(functions.config().firebase)相对于其他方法有什么好处?functions.config()从哪里获取数据,这不只是一个Node模块吗?

1个回答

12
通常情况下,在您的云函数代码顶部,您会有以下内容:
var functions = require('firebase-functions');

作为 firebase-functions 节点模块的一部分,您可以访问 functions.config().firebase。这只是一个对象,包含了初始化 Admin SDK 所需的所有内容,包括数据库 URL 和基于应用程序默认凭据的凭证实现。如果在代码中使用 console.log(functions.config().firebase),您会发现它只是一个带有这些属性和其他一些您可能想在代码中使用的属性的对象。
您可以向此对象添加 databaseAuthVariableOverride限制 Admin SDK 的权限。您可以直接覆盖对象本身:
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);

如果我没记错的话,Object.assign() 的参数顺序很重要。在极少数情况下,如果 functions.config().firebase 包含 databaseAuthVariableOverride 属性,则会覆盖您上面指定的属性。我建议使用 Object.assign({}, functions.config().firebase, { /* your overriding values */ }) 来确保您设置的任何内容都作为最终值保留。 - samthecodingman
使用自定义服务工作器证书初始化管理员是否是一个好主意? - Ilja
@Ilja - 你可以这样做,但与使用 functions.config().firebase 提供的凭据相比,没有任何好处。而且这需要你自己管理服务帐户密钥文件,这通常是不好的做法。@samthecodingman - 感谢你的提示。我已经更新了我的代码示例。 - jwngr
看起来你在 Firebase 中的项目名称是云函数的 uid。我还在寻找更多信息的文档。 - dardub
我曾经对Cloud Functions和Firebase Functions感到困惑,然后我尝试在Firebase Function中使用这段代码。如果有人想知道如何仅为Firebase函数提供写入访问权限,答案已经在这里写出来了https://dev59.com/bKHia4cB1Zd3GeqPQT_x,请注意在规则中指示拒绝所有人。 - moonw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接