Как я могу инициализировать приложение Firebase в модели без сервера? Каков предел одновременных приложений? - PullRequest
0 голосов
/ 03 сентября 2018

Я создал функцию без сервера, которая выполняет Проверка токена Firebase .

Все работает как задумано. За исключением того, что я получаю ошибки при последующих вызовах, чтобы инициализировать мое приложение, что приложение по умолчанию уже существует (тот же контейнер). Это поднимает некоторые вопросы.

  1. Если бы в моей серверной инфраструктуре было несколько параллельных контейнеров, каждый из которых работал над инициализацией приложения. Будет ли это также вызвать эту ошибку? Что приложение инициализировано в другом месте? Или эта ошибка изолирована для локальных экземпляров?
  2. Если это последнее, если я предоставляю именованное приложение на основе контейнера, в котором оно запускается, есть ли ограничение на максимальный уровень приложений, которое можно инициализировать одновременно?

Вот как я сейчас инициализирую приложение:

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

Я мог бы сделать это, но не уверен насчет ограничений приложений Firebase или одновременных инициализаций (не могу найти какие-либо подробности в документации):

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

Или я должен просто переписать это, используя свой собственный JWT Decoder и получить открытые ключи от 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 голосов
/ 03 сентября 2018

Если при инициализации SDK администратора появляется сообщение о том, что приложение по умолчанию уже существует, это означает, что вы пытаетесь дважды запустить SDK администратора в одном и том же процессе. Очевидно, не делай этого. Если вы инициируете один раз и только один раз для процесса, вы никогда не увидите эту ошибку.

Вам нужно будет позаботиться о том, чтобы вызывать метод init только один раз для экземпляра сервера. Непонятно, что именно вы делаете из кода, который вы показали. Я не знаю насчет python, но с помощью узла вы можете без проблем инициировать один раз в глобальном контексте. Если вам нужно инициализировать во время выполнения функции, у вас должен быть флаг для проверки того, что приложение Firebase по умолчанию еще не инициализировано, и инициализация только условно на основе этого флага.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...