Firebase Cloud Function配置以访问其他项目数据库

Pri*_*ner 5 firebase google-cloud-functions

我需要创建一个Cloud Function来访问另一个项目中运行的Firebase DB。如果它正在访问当前项目中的数据库,则可以使用如下代码

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

const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
Run Code Online (Sandbox Code Playgroud)

但是,我要functions.config().firebase返回的是其他项目的信息(最重要的是凭据)。有没有简单的方法可以做到这一点?

Mic*_*igh 5

functions.config().firebase是保留的名称空间,您将无法覆盖它。但是,您可以自己进行跨项目初始化。这是我的处理方式:

首先,将其他项目的服务帐户下载functions目录中。命名它<project_id>-sa.json。接下来,设置一些环境配置(app.fb_project_id仅是示例名称,不是必需的):

firebase functions:config:set app.fb_project_id="<the_project_id>"
Run Code Online (Sandbox Code Playgroud)

现在,在您的代码中,您可以像这样初始化Admin SDK:

const functions = require('firebase-functions');
const admin = require('firebase-admin');

if (!functions.config().app || !functions.config().app.project_id) {
  throw new Error('Cannot start app without app.fb_project_id config.');
}

const FB_PROJECT_ID = functions.config().app.fb_project_id;
const SERVICE_ACCOUNT = require(`./${FB_PROJECT_ID}-sa.json`);

admin.initializeApp({
  databaseURL: `https://${FB_PROJECT_ID}.firebaseio.com`,
  credential: admin.credential.cert(SERVICE_ACCOUNT)
});
Run Code Online (Sandbox Code Playgroud)

这将为另一个项目初始化Admin SDK。

  • 将这些 json 凭据推送到 repo 中可能是一个糟糕的主意。 (2认同)
  • 是的。`.gitignore` 是你的朋友 (2认同)
  • @MichaelBleigh,将项目 B 中的 [Firebase 实时数据库角色](https://firebase.google.com/docs/projects/iam/roles-predefined-product#realtime-database) 授予 [项目 A 的服务帐户 `project-id@appspot.gserviceaccount.com`](https://firebase.google.com/support/guides/service-accounts) [用于运行云功能](https://firebase.google.com/support/guides/service-accounts) /stackoverflow.com/a/56618369/3082178)以避免显式指定凭据? (2认同)
  • @AKd 是的,您应该能够为此目的授予跨项目角色。这将是执行上述操作的另一种方法。 (2认同)