У меня проблема с аутентификацией angular, при которой неверные данные отправляются с использованием angularfire auth.
Поток аутентификации довольно обычный:
- switchMap пользователь authState к пользовательскому документу из базы данных
- выдать пользовательские изменения документа через BehaviourSubject
- , пользователь аутентифицируется через oAuth
- документ в БД обновляется после входа в систему с данными из oAuth провайдер
- триггер БД применяет некоторые дополнительные метаданные (например, последнее изменение)
Что происходит, когда пользователь аутентифицируется, так это то, что подписчики на объект BehaviourSubject получают два излучения:
- Пользовательские данные, основанные на данных поставщика oAuth (которые являются неполными, поскольку они не включают данные в пользовательском документе), затем
- Данные документа пользователя из БД - которые являются полными пользовательскими данными.
Итак, первая эмиссия нежелательна, это не данные из БД. Вторая эмиссия является правильной.
I думаю причина двух эмиссий заключается в том, что:
- Во-первых, пользовательское обновление после входа в oAuth вызывает обновление в локальном кэше, которое затем отправляется Observable (неполные данные пользователя)
- (я проверил это, отключив обновление, и первое излучение не произошло)
- Позже триггер БД затем обновляет документ в БД, и когда и эти данные синхронизируются с клиентом, они отправляются из наблюдаемого пользовательского документа - на этот раз это полные пользовательские данные.
(Постоянство не включается, если это имеет значение)
Итак, мои вопросы:
- Верно ли мое предположение о причине? (локальное обновление, а затем триггерное обновление)
- Как лучше всего предотвратить первое локальное обновление и дождаться полного документа?
- Стоит ли просто проверять наличие свойств, которые находятся только в записи БД и игнорируют другие изменения?
- Есть ли более элегантное решение этой проблемы?