【发布时间】: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