Круговая зависимость из-за потока аутентификации Firebase - PullRequest
1 голос
/ 21 мая 2019

Я создаю собственное приложение, которое использует Firebase для аутентификации. Проблема возникает из-за того, что Firebase автоматически регистрирует пользователя после создания учетной записи, и это приводит к проблеме с настройкой данных пользователя.

Firebase рекомендует использовать обратный вызов onAuthStateChanged для наблюдения, когда пользователи входят и выходят из системы. Цикл происходит потому, что мне нужно установить локальное состояние притока пользователя после создания учетной записи, но onAuthStateChanged запускается сразу после создания пользователя и запускает загрузку состояния пользователя до его создания.

Когда пользователь входит в систему или приложение перезапускается, мне нужно загрузить информацию об их существующей учетной записи, хранящуюся в базе данных. Для этого требуется, чтобы метод loadUserLocal был запущен в какой-то момент после того, как обратный вызов onAuthStateChanged обнаружит изменение в состоянии аутентификации, но, похоже, это противоречит способу создания нового пользователя. Обратный вызов onAuthStateChanged в основном перехватывает процесс, ведущий к вызову loadUserLocal до того, как для новой учетной записи пользователя будет установлен начальный набор данных.

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

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

Метод signUp выглядит следующим образом:

export async function signUp(dispatch, email, password) {
  const userData = {
    <...initial user data is set here...>
  }

  await auth.createUserWithEmailAndPassword(email, password)
  await saveUserLocal(userData)
  setUserData(dispatch, userData)
}

Проблема возникает из-за того, что метод auth.createUserWithEmailAndPassword вызывает метод onAuthStateChanged до того, как saveUserLocal сможет его запустить. А изменение аутентификации приводит к тому, что loadUserLocal вызывается до saveUserLocal, поэтому userData не содержит необходимой информации.

Я могу придумать, как этого избежать, но потом я сталкиваюсь с проблемами при входе в систему и обновлении процессов. Им обоим необходимо вызвать loadUserLocal, чтобы получить необходимую информацию для существующего пользователя. Каждый раз, когда я пытаюсь решить один из них, другой, кажется, ломается. И все это выглядит так, как будто это связано с тем фактом, что Firebase вынуждает войти в систему после создания пользователя, а это означает, что я не могу настроить данные учетной записи пользователя до того, как он войдет в систему и потребует данные. Я пытался сохранить данные учетной записи пользователя перед созданием пользователя с помощью Firebase, но для сохранения его информации мне нужен пользовательский UID, созданный Firebase. Это приводит к тому же циклу зависимости, что и раньше.

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