Firebase 4.1.3:首次使用电子邮件和密码登录后未调用onAuthStateChange

时间:2017-07-14 17:21:45

标签: javascript firebase firebase-authentication

我将我的应用的Firebase版本从3.5.0升级到4.1.3,并注意到用户在验证其电子邮件地址后第一次成功登录后,不再调用onAuthStateChange回调函数。

该应用程序是用JavaScript编写的。

这些是我的代码的相关部分:

回调设置

firebase.auth().onAuthStateChanged(onAuthStateChange);

回调

function onAuthStateChange (user) {
    console.log(user); // Not appearing in console
}

登录

firebase.auth().signInWithEmailAndPassword(email, password)
    .then(function (user) {
        console.log("signInWithEmailAndPassword success"); // This appears in the console
    })
    .catch(function(error) {
        console.log("signInWithEmailAndPassword", error);
        self.signInError = error.message;
        $timeout(function () {
            $scope.$apply();
        });
    });

修改 - 这些是重现问题的步骤(我的应用用户的典型操作):

  • 用户下载并启动应用
  • 用户使用电子邮件和密码注册
  • 应用程序发送电子邮件验证电子邮件
  • 用户收到验证电子邮件并点击链接
  • 用户登录应用页面
  • 用户登录触发console.log(“signInWithEmailAndPassword成功”);
  • onAuthStateChanged回调不是名为

用于开发和测试目的(不是用户会做什么,但我做了)

  • 用户重新加载应用
  • 用户现在在应用
  • 用户退出应用
  • 用户登录应用程序,触发console.log(“signInWithEmailAndPassword success”);
  • onAuthStateChanged回调 称为

2 个答案:

答案 0 :(得分:1)

问题在于auth()。createUserWithEmailAndPassword()实际上确实登录了某种类型的用户。

您会发现,如果输入

firebase.auth().onAuthStateChanged(user => {
  console.log("onAuthStateChanged()"); 

createUserWithEmailAndPassword()确实触发了控制台日志。但是,似乎没有有效的“用户”对象,这可以解释为什么由于只记录用户而对您来说什么都不显示。

我遇到了完全相同的问题。在sendEmailverification()步骤中,请注意它是如何要求您使用auth()。currentUser的,它表明必须有某种形式的用户登录(我不确定firebase如何处理后面经过电子邮件验证的用户与未验证的用户之间的差异场景)

您可以在发送电子邮件验证后简单地调用signOut()函数,它应该允许首次登录时调用onAuthStateChanged()函数(无需重新加载应用程序)

  firebase.auth().currentUser.sendEmailVerification()
  .then(() => {
    console.log("Email verification sent");
    firebase.auth().signOut().then(() => {
      console.log("Signed out!");
    }).catch((err) => {
      console.log("Error signing out!", err);
    });

令人困惑的是,您实际上可以成功地“登录”而不会导致AuthStateChanged发生更改或返回任何错误。

TLDR:请记住在发送电子邮件验证后使用auth()。signOut()函数。

答案 1 :(得分:0)

尝试这种方式,我希望它可以工作

firebase.auth().onAuthStateChanged(function(user){
console.log(user);
})