我创建了一个执行该Firebase Token Validation的无服务器功能。
一切正常。除此之外,在后续调用中我收到错误信息,以初始化默认应用程序已经存在(相同容器)的应用程序。这引起了一些问题。
这是我现在初始化应用程序的方式:
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对其进行解码。
答案 0 :(得分:1)
如果在初始化admin SDK时收到错误消息,提示默认应用程序已存在,则意味着您试图在同一过程中两次初始化admin SDK。显然,不要那样做。如果您仅对每个进程进行一次初始化,那么您将永远不会看到此错误。
您必须注意每个服务器实例仅调用一次init方法。目前还不清楚所显示的代码在做什么。我不了解python,但是有了node,您就可以在全局上下文中一次初始化而不会出现问题。如果您需要在函数执行过程中进行初始化,则应检查一些标志以确保尚未初始化默认的Firebase应用,并且仅根据该标志有条件地进行初始化。