Angular Проверка подлинности Firebase выполняется дважды - сначала с неполными данными - PullRequest
1 голос
/ 28 марта 2020

У меня проблема с аутентификацией angular, при которой неверные данные отправляются с использованием angularfire auth.

Поток аутентификации довольно обычный:

  • switchMap пользователь authState к пользовательскому документу из базы данных
  • выдать пользовательские изменения документа через BehaviourSubject
  • , пользователь аутентифицируется через oAuth
  • документ в БД обновляется после входа в систему с данными из oAuth провайдер
  • триггер БД применяет некоторые дополнительные метаданные (например, последнее изменение)

Что происходит, когда пользователь аутентифицируется, так это то, что подписчики на объект BehaviourSubject получают два излучения:

  1. Пользовательские данные, основанные на данных поставщика oAuth (которые являются неполными, поскольку они не включают данные в пользовательском документе), затем
  2. Данные документа пользователя из БД - которые являются полными пользовательскими данными.

Итак, первая эмиссия нежелательна, это не данные из БД. Вторая эмиссия является правильной.

I думаю причина двух эмиссий заключается в том, что:

  • Во-первых, пользовательское обновление после входа в oAuth вызывает обновление в локальном кэше, которое затем отправляется Observable (неполные данные пользователя)
    • (я проверил это, отключив обновление, и первое излучение не произошло)
  • Позже триггер БД затем обновляет документ в БД, и когда и эти данные синхронизируются с клиентом, они отправляются из наблюдаемого пользовательского документа - на этот раз это полные пользовательские данные.

(Постоянство не включается, если это имеет значение)

Итак, мои вопросы:

  • Верно ли мое предположение о причине? (локальное обновление, а затем триггерное обновление)
  • Как лучше всего предотвратить первое локальное обновление и дождаться полного документа?
  • Стоит ли просто проверять наличие свойств, которые находятся только в записи БД и игнорируют другие изменения?
  • Есть ли более элегантное решение этой проблемы?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...