我创建了一个执行Firebase令牌验证的无服务器函数。
一切都按预期工作。除了,我在后续调用初始化我的应用程序时收到错误,默认应用程序已经存在(同一容器(。这就提出了一些问题。
- 如果我的无服务器基础结构要启动多个并发容器,每个容器都用于初始化应用程序。 这也会导致此错误吗?该应用程序在其他地方启动?或者此错误是隔离到本地实例的?
- 如果是后者,如果我根据启动应用的容器提供命名应用,那么一次可以初始化的应用的最大数量是否有 Firebase 限制?
这就是我现在初始化应用程序的方式:
cred = credentials.Certificate(SERVICE)
firebase_admin.initialize_app(cred)
我可以这样做,但不确定 firebase 应用程序限制或并发初始化(在文档中找不到任何细节(:
cred = credentials.Certificate(SERVICE)
firebase_admin.initialize_app(cred, 'APP-NAME-[CONTAINERID]')
或者,我应该使用我自己的 JWT 解码器并从谷歌获取公钥来重写它吗?
这是完整的错误:
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 对其进行解码。
如果在初始化管理员 SDK 时收到错误,指出默认应用已存在,则仅表示您尝试在同一进程中初始化管理 SDK 两次。 显然,不要那样做。 如果每个进程初始化一次且仅初始化一次,则永远不会看到此错误。
您必须注意每个服务器实例仅调用一次 init 方法。 从您显示的代码中不清楚您在做什么。 我不了解 python,但使用 node,您可以在全局上下文中初始化一次而不会出现问题。 如果您需要在函数执行期间初始化,您应该检查一些标志,以确保默认的 Firebase 应用尚未初始化,并且仅基于该标志有条件地初始化。