Node.js 使用空参数admin.credential.applicationDefault()和serviceAccount凭据使用firebase admin初始化应用程序时的差异

Node.js 使用空参数admin.credential.applicationDefault()和serviceAccount凭据使用firebase admin初始化应用程序时的差异,node.js,firebase,google-cloud-firestore,google-cloud-functions,firebase-admin,Node.js,Firebase,Google Cloud Firestore,Google Cloud Functions,Firebase Admin,考虑到Firebase Cloud Function Node.js环境,以何种方式: 选择1 与此不同: 选择2 或者这个: 选择3 它们在云函数中似乎都能正常工作,这些函数可以写入受保护的集合,如下所示: match /productsAll/{documentID} { allow read; allow write: if request.auth.token.admin == true; } 以下信息基于firebase admin-node@8.9.0,发布时的当前Node

考虑到Firebase Cloud Function Node.js环境,以何种方式:

选择1

与此不同:

选择2

或者这个:

选择3

它们在云函数中似乎都能正常工作,这些函数可以写入受保护的集合,如下所示:

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云功能环境或本地服务项目中,此环境变量由相关Firebase项目的配置填充

最后,选项3允许您配置自己的服务帐户以用于AdminSDK实例。您可以使用它来缩小管理SDK的访问范围,例如只访问云Firestore而不访问云存储。这在处理具有单一用途Admin.initializeApp{…}“某些命名实例”的辅助管理SDK实例时特别有用。当您希望在测试环境中而不是在生产数据库中运行代码时,也可以使用它。它还允许您向服务帐户(如Gmail和Google Docs)中添加其他Google拥有的服务的更多作用域,以简化您的实现。

以下信息基于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云功能环境或本地服务项目中,此环境变量由相关Firebase项目的配置填充


最后,选项3允许您配置自己的服务帐户以用于AdminSDK实例。您可以使用它来缩小管理SDK的访问范围,例如只访问云Firestore而不访问云存储。这在处理具有单一用途Admin.initializeApp{…}“某些命名实例”的辅助管理SDK实例时特别有用。当您希望在测试环境中而不是在生产数据库中运行代码时,也可以使用它。它还允许您向服务帐户(如Gmail和Google Docs)中的其他Google拥有的服务添加更多作用域,以简化您的实现。

关于写入受保护集合的最后一点,Firestore Admin SDK将忽略任何安全规则,并具有完全的读/写访问权限。@samthecodingman谢谢!这正是我所期待的,但在我在这里提出的另一个问题中,有人提到了相反的情况。很高兴证实这一点!感谢向受保护的集合写入的最后一点,Firestore管理SDK将忽略任何安全规则,并具有完整的读/写访问权限。@samthecodingman谢谢!这正是我所期待的,但在我在这里提出的另一个问题中,有人提到了相反的情况。很高兴证实这一点!谢谢,您可能会看到functions.config.firebase在旧代码中使用。这是不推荐使用的,以前被设置为FIREBASE_CONFIG的解析形式,现在只是未定义,因此不会干扰现代代码。如果您想在Google/FIREBASE执行环境之外运行代码,应用程序的默认凭据可以来自系统的gcloud配置,也可以来自GOOGLE_application_credentials环境变量
颂诗这是不推荐使用的,以前被设置为FIREBASE_CONFIG的解析形式,现在只是未定义,因此不会干扰现代代码。如果您想在Google/FIREBASE执行环境之外运行代码,应用程序的默认凭据可以来自系统的gcloud配置,也可以来自GOOGLE\u application\u credentials环境变量。
admin.initializeApp({
  credential: admin.credential.applicationDefault()
});
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
});
match /productsAll/{documentID} {
  allow read;
  allow write: if request.auth.token.admin == true;
}