【问题标题】:Firebase Verify ID token strange behaviorFirebase 验证 ID 令牌的奇怪行为
【发布时间】:2020-09-11 08:47:20
【问题描述】:

基于本文实现的verifiedtoken函数:

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】:

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

    【讨论】:

    • 谢谢,它有效。 Console.log-ing uid 给了我正确的结果。我想将uid 返回到父函数并处理它。如何将孩子分配给create 函数内的变量并继续下一行?
    猜你喜欢
    • 2017-01-24
    • 1970-01-01
    • 2018-05-28
    • 2021-12-04
    • 2019-04-09
    • 2018-07-23
    • 2019-06-28
    • 2021-05-04
    • 2020-02-10
    相关资源
    最近更新 更多