根据本文实现的已验证令牌功能:
https://firebase.google.com/docs/auth/admin/verify-id-tokens
出现以下错误:
错误:默认Firebase应用已存在。这意味着您多次调用了initializeApp(),而没有提供应用名称作为第二个参数。在大多数情况下,您只需要调用一次initializeApp()。但是,如果您确实要初始化多个应用程序,则将第二个参数传递给initializeApp()以为每个应用程序指定唯一的名称。
这是代码:
'use strict';
const admin = require('firebase-admin');
module.exports = {
async create(ctx) {
let request_body = ctx.request.body;
var app = await admin.initializeApp({
credential: {...},
databaseURL: "https://project.firebaseio.com"
});
admin.auth(app).verifyIdToken(request_body.token)
.then(async function (decodedToken) {
let uid = decodedToken.uid;
return uid;
}).catch(function (error) {
});
}
};
每个实例只能初始化一个FirebaseApp
实例一次。由于Cloud Functions可能会重新使用容器实例,因此您最终需要多次调用initializeApp
。
为了防止这种情况,请检查实例是否已经初始化:
var app;
module.exports = {
async create(ctx) {
let request_body = ctx.request.body;
if (!app) {
app = admin.initializeApp({
credential: {...},
databaseURL: "https://project.firebaseio.com"
});
}
return admin.auth(app).verifyIdToken(request_body.token)
.then(async function (decodedToken) {
let uid = decodedToken.uid;
return uid;
}).catch(function (error) {
});
}
};
或替代:
module.exports = {
async create(ctx) {
let request_body = ctx.request.body;
if (admin.apps.length === 0) {
admin.initializeApp({
credential: {...},
databaseURL: "https://project.firebaseio.com"
});
}
let app = admin.apps[0];
return admin.auth(app).verifyIdToken(request_body.token)
.then(async function (decodedToken) {
let uid = decodedToken.uid;
return uid;
}).catch(function (error) {
});
}
};