如何在无服务器模型中初始化firebase应用程序?并发应用程序限制是多少?

时间:2018-09-02 23:46:28

标签: firebase firebase-authentication serverless

我创建了一个执行该Firebase Token Validation的无服务器功能。

一切正常。除此之外,在后续调用中我收到错误信息,以初始化默认应用程序已经存在(相同容器)的应用程序。这引起了一些问题。

  1. 如果我的无服务器基础架构要启动多个并发容器,则每个容器都会初始化应用程序。这还会导致此错误吗?该应用已在其他地方初始化?还是该错误被隔离到本地实例?
  2. 如果是后者(如果我基于启动它的容器提供了一个命名的应用程序),那么可以一次初始化的最大应用程序数量是否有Firebase限制?

这是我现在初始化应用程序的方式:

cred = credentials.Certificate(SERVICE)
firebase_admin.initialize_app(cred)

我可以执行此操作,但不确定Firebase应用程序的限制或并发初始化(无法在文档中找到任何详细信息):

cred = credentials.Certificate(SERVICE)
firebase_admin.initialize_app(cred, 'APP-NAME-[CONTAINERID]')

或者,我是否应该使用自己的JWT解码器并从Google抓取公钥来重写它?

这是完整的错误:

Error occurred setting firebase credentials: The default Firebase app already exists. This means you called initialize_app() more than once without providing an app name as the second argument. In most cases you only need to call initialize_app() once. But if you do want to initialize multiple apps, pass a second argument to initialize_app() to give each app a unique name.

更新:AWS Lambda,Python。

我将进行以下测试,以防止在执行热函数时在同一容器中重新初始化应用程序,并假设执行auth.validate_id_token()不受API限制,并且继续进行此操作不会与并发容器执行冲突。如果测试结果不同,则会报告错误。

try:
    firebase_admin.get_app()
    logger.info('firebase already intialized.')
except ValueError as e:
    logger.info('firebase not initialized. initialize.')
    cred = credentials.Certificate(SERVICE)
    firebase_admin.initialize_app(cred)

我可能仍将迁移到另一个JWT验证以减小功能大小(因为我已经有一个jwt库供我自己的应用使用),并且不再依赖Firebase API对其进行解码。

1 个答案:

答案 0 :(得分:1)

如果在初始化admin SDK时收到错误消息,提示默认应用程序已存在,则意味着您试图在同一过程中两次初始化admin SDK。显然,不要那样做。如果您仅对每个进程进行一次初始化,那么您将永远不会看到此错误。

您必须注意每个服务器实例仅调用一次init方法。目前还不清楚所显示的代码在做什么。我不了解python,但是有了node,您就可以在全局上下文中一次初始化而不会出现问题。如果您需要在函数执行过程中进行初始化,则应检查一些标志以确保尚未初始化默认的Firebase应用,并且仅根据该标志有条件地进行初始化。