Я создаю собственное приложение, которое использует 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. Это приводит к тому же циклу зависимости, что и раньше.