Firebase 验证 ID 令牌异常行为

Firebase Verify ID token strange behavior

基于这篇文章实现了verifiedtoken功能:

https://firebase.google.com/docs/auth/admin/verify-id-tokens

出现以下错误:

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.

这是代码:

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

      });

  }
};