Firebase когда запускается onAuthStateChanged?

# #firebase #firebase-authentication

Вопрос:

Если у меня есть функция createUserWithEmailAndPassword, структурированная следующим образом

     await auth.createUserWithEmailAndPassword(email, password).then((userCredential) => {
        code stuff...
        return promise
    }).then(() => {
        ...
    }).catch(() => {
        ...
    }).finally(() => {
        ...
    })
 

Когда в цепочке обещаний включится наблюдатель с поддержкой onAuthStateChanged?

Комментарии:

1. Это похоже на то, что вы могли бы наблюдать сами с помощью некоторых журналов консоли.

Ответ №1:

onAuthStateChanged Наблюдатель запускается только тогда, когда пользователь либо входит в систему, либо выходит из нее.

Из документации:

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

Чтобы сохранить прежнее поведение, см. раздел firebase.auth.Auth.onIdTokenChanged

При этом, если у вас есть onAuthStateChanged наблюдатель, он сработает, как только пользователь войдет в систему, и код внутри вашего .then() блока может выполняться или не выполняться полностью. Если ваш наблюдатель аутентификации перенаправляет пользователей на какую-либо другую страницу при входе в систему, то существует высокая вероятность того, что ваш пользователь будет перенаправлен до завершения блокировки.

Если вам нужно выполнить какой-либо код после входа пользователя в систему, вам следует отказаться от подписки от наблюдателя аутентификации:

 const auth = firebase.auth()

const authObserver = auth.onAuthStateChanged((user) => {
  if (user) {
    // redirect
  }
})


btnLogin.onclick = async function () {
  //unsubscribe
  authObserver()

  await auth.createUserWithEmailAndPassword(email, password).then((userCredential) => {
        // onAuthStateChanged will trigger here if not disabled
        //code stuff...
        //return promise
    }).then(() => {
        // your code
    })
}