Firebase验证ID令牌的异常行为

问题描述 投票:0回答:1

根据本文实现的已验证令牌功能:

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) {

    });

  }
};
node.js firebase-authentication firebase-admin
1个回答
1
投票

每个实例只能初始化一个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) {

      });

  }
};
© www.soinside.com 2019 - 2024. All rights reserved.