繁体   English   中英

使用 Firebase Admin SDK 处理多个服务帐户的最佳方法是什么?

[英]What is the best approach for handling multiple Service Accounts with Firebase Admin SDK?

如果我有多个服务帐户用于我想要与之交互的不同 Firebase 项目,使用 Firebase Admin SDK,考虑到大多数操作将由主要 Firebase 项目上的事件触发,最好的方法是什么?

将有一个主要的 Firebase 项目将在某些事件上触发云功能,然后必须去对其他 firebase 项目执行操作。

我在 Firebase 的文档中找到的最接近的是: https ://firebase.google.com/docs/admin/setup?authuser=0&hl=en#initialize-multiple-apps 我绝对可以做到,但现在我需要知道我应该在单独的节点服务器中还是在 Primary Firebase 项目 Cloud Functions 中执行此操作?

以下是我正在考虑的选项。 我不确定第一个是否可能,在搜索时都找不到答案,所以这里的任何建议将不胜感激:

  1. 使用 Firebase 云功能本身。 这可能不是正确的方法,但我只是想问一下并确定一下。 所以我的想法是,如果我有 Primary Firebase 项目来执行其他项目的所有“管理”,如果我在云函数内部的函数中引用该服务帐户密钥,是否可以对另一个 Firebase 项目执行操作初级项目? 然后我会做另一个admin.initializeApp() 但在父云功能的功能使用其他项目的服务凭证吗? (我已经对这个解决方案犹豫不决了,但也许没关系,idk?)

  2. 使用 Express 应用程序/节点服务器:拥有一个独立于主要 Firebase 项目的节点服务器是否更好,它具有可以对其他各种 Firebase 项目执行操作的端点? 然后,在主 Firebase 云函数帐户中触发的函数将调用这些端点。 如果是这样,那么使用主 Firebase 帐户的云存储来存储不同的服务帐户 JSON 文件,然后将服务帐户的 URL 传递给该端点并使用它进行初始化是否是一种安全的方法?

所有这一切的简化版本是,我如何通过云函数对多个其他 Firebase 项目执行操作? 谢谢!

结果我确实选择了第一个选项,看来您实际上可以在 Firebase admin SDK 中使用多个应用程序。

这是一个小示例,说明当我检测到新服务帐户已添加到我的主要 firebase 项目的serviceAccounts Firestore 集合时,我将如何向其他 Firebase 项目添加时间戳。

请注意,这只是一个示例,所以有一个答案。 我不打算实际实现这个确切的功能。 在此示例中,serviceAccount JSON 文件的数据作为原始文本存储在 Firestore 文档中,我实际上不会这样做。

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

// Initialize Primary (Parent) Admin SDK
admin.initializeApp();

// User Service Account Upload
exports.newServiceAccount = functions.firestore
  .document("projects/{projectId}/service_accounts/{accountId}")
  .onCreate(async (snap, context) => {
    const serviceAccount = snap.data();
    const projectId = context.params.projectId;

    // Initialize the app with a new service account if it does not already exist
    let userApp;
    if (admin.apps.includes(projectId)) {
      userApp = admin.app(projectId);
    } else {
      userApp = admin.initializeApp(
        { credential: admin.credential.cert(serviceAccount) },
        projectId
      );
    }

    await userApp.firestore().collection("test").add({
      timestamp: new Date(),
    });
  });

这里有一个检查,看看我的其他项目应用程序是否已经初始化。

该解决方案适用于我的用例,现在我可以使用我的一个 Primary Firebase 项目管理多个 Firebase 项目。 (在云功能中)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM