考虑Firebase Cloud Function Node.js环境,其方式如下:
选项 #1
admin.initializeApp()
与此不同:
选项 #2
admin.initializeApp({
credential: admin.credential.applicationDefault()
});
或者这个:
选项 #3
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
});
它们似乎都可以在写入受保护集合的云函数中正常工作,如下所示:
match /productsAll/{documentID} {
allow read;
allow write: if request.auth.token.admin == true;
}
以下信息基于发布时的firebase-admin-node@8.9.0
,当前Node.js SDK:
就所使用的凭据而言,选项1 和选项 2在功能上是相同的。
每当FirebaseAppOptions
对象(第一个参数(没有'credential'
属性时,它就会设置为getApplicationDefault(...)
,与admin.credential.applicationDefault()
方法中使用的属性相同。这是您运行代码的 Google/Firebase 执行环境提供的凭据。
但是,在选项 1 中,Firebase 配置变量(databaseURL
、databaseAuthVariableOverride
、projectId
等(都是使用环境变量FIREBASE_CONFIG
填充的,而在选项2和选项 3中,它们必须由您的代码显式设置。
FIREBASE_CONFIG
环境变量是 JSON 字符串或文件的路径。在 Firebase Cloud Functions 环境或本地服务的项目中,此环境变量会填充相关 Firebase 项目的配置。
最后,选项 3允许您配置自己的服务帐户以用于您的管理 SDK 实例。您可以使用它来缩小您的管理 SDK 拥有的访问权限 - 例如只能访问 Cloud Firestore 而不是 Cloud Storage。这在处理具有单一用途 (admin.initializeApp({...}, 'some-named-instance')
( 的辅助管理 SDK 实例时特别有用。当您希望在测试环境中而不是在生产数据库上运行代码时,也可以使用它。它还允许您将更多范围添加到其他 Google 拥有的服务(例如 Gmail 和 Google 文档(的服务帐户中,以简化您的实施。