【问题标题】:Initialize service account and clound functions together-Firebase一起初始化服务帐号和云函数-Firebase
【发布时间】:2018-08-14 16:48:16
【问题描述】:

如何同时初始化云功能和服务帐户。在我的 index.ts 文件中,我已经使用

初始化了函数

admin.initializeApp(functions.config().firebase);

但现在我想用 firebase 创建自定义令牌,所以我创建了一个服务帐户并在我的函数文件夹中添加了 service-account.json 并添加了

const serviceAccount = require("./service-account.json");
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://functionstest-54bd9 .firebaseio.com"
});

上面的初始化函数。但是当我尝试部署该功能时,我在控制台中遇到了这个错误

Error: The default Firebase app already exists. This means you called initializeApp() more than once without providing an app name as the second argument. In most cases you only need to call initializeApp() once. But if you do want to initialize multiple apps, pass a second argument to initializeApp() to give each app a unique name.
    at FirebaseAppError.FirebaseError [as constructor] (/home/me/Documents/TfmFirebase/functions/node_modules/firebase-admin/lib/utils/error.js:39:28)
    at FirebaseAppError.PrefixedFirebaseError [as constructor] (/home/me/Documents/TfmFirebase/functions/node_modules/firebase-admin/lib/utils/error.js:85:28)

我只有一个应用程序,并且我只添加了一个服务帐户。我是否必须创建另一个应用程序才能仅创建自定义令牌?我怎样才能解决这个问题?

更新1

这就是我创建自定义令牌的方式,

//create user
let writeResult = await db.collection('users').add({
                    user: user,
                    password: password,
                    isBlocked: false,
                    joiningDate: Date.now(),
                    phoneVerified: false,
                    deleted: false,
                    contacts:{
                        phone: phone
                    }
                })

//create token
let tokenSnapShot = await admin.auth().createCustomToken(writeResult.id);
const userRef = db.collection('users').doc(writeResult.id);
let updateResult = await userRef.get();
t.update(userRef,{ "token": updateResult.data() });

如果我做错了请纠正我

【问题讨论】:

  • admin.initializeApp(functions.config().firebase); 应该允许您创建自定义令牌。为什么还要使用服务帐号?
  • 我没有使用 firebase 提供的登录方法,因为我的应用在注册用户时需要更多字段。所以注册是在云功能中完成的,我正在使用文档 ID 创建自定义令牌,以便我可以在 firebase 安全规则中访问它。我可以在 Firebase 规则中使用文档 ID 作为身份验证 ID 吗?
  • "我正在使用文档 ID 创建自定义令牌" 我不确定它是如何工作的。也许您可以发布您的功能代码?
  • @Sidney 我更新了我的问题
  • 看起来您正在将所有用户数据存储在数据库中。您是否有理由不使用 firebase auth 来存储密码和处理身份验证?

标签: firebase google-cloud-functions service-accounts


【解决方案1】:

我只是在研究同一主题。当您在本地主机上工作时。您将需要额外的安全性来访问您的数据库。因此,在 localhost 工作时,您需要管理 service key,并且可以使用 emulate only HTTPS 功能。在 firebase 托管工作时,您不需要此帐户密钥。但也可以正常工作。然后你需要在上面的代码中删除

1.admin.initializeApp(functions.config().firebase); 

const serviceAccount = require("./service-account.json");
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://functionstest-54bd9 .firebaseio.com"
});

【讨论】:

  • 我没有使用本地服务器,我正在将功能部署到 firebase 并从那里访问。我只尝试了admin.initializeApp(functions.config().firebase);,它给了我一个错误,指出它需要一个私钥
  • 如果您已将服务密钥部署到 Firebase 托管,则仅使用第二选择并删除第一行。 admin.initializeApp(functions.config().firebase);
  • 并考虑 service-account.json 是您从链接下载的原始文件名 :console.firebase.google.com/u/0/project/_/settings/… 并确保路径。在您的情况下,此文件接缝位于/functions / root 下。
  • 对不起,我没有得到这个if you have...我每次注册用户都必须使用服务帐户
  • service-account.json 位于函数文件夹内
猜你喜欢
  • 1970-01-01
  • 2021-03-12
  • 2020-12-08
  • 2020-11-29
  • 2018-09-22
  • 1970-01-01
  • 2018-06-21
  • 2020-01-12
  • 2018-07-22
相关资源
最近更新 更多