javascript user.emailVerified在点击电子邮件验证链接firebase后不会改变

kzmpq1sx  于 12个月前  发布在  Java
关注(0)|答案(6)|浏览(115)

在学习发送email verification is possible in latest firebase之后,虽然文档中缺少这一点,但我想自己测试一下。
使用下面的代码片段:

Auth.$onAuthStateChanged(function(firebaseUser) {
    if (firebaseUser) {
      console.log(firebaseUser);
      if (firebaseUser.emailVerified) {
        // console.log(firebaseUser.emailVerified); 
        toastr.success('Email verified');
      } else {
        toastr.info('Do verify email');
      }
    }
  })

字符串
console.log(firebaseUser.emailVerified)总是返回false,尽管发送验证已启动,电子邮件已收到并已单击。
使用电子邮件登录后,我会检查用户是否经过验证,如果没有,则应发送电子邮件:

Auth.$signInWithEmailAndPassword(email, password)
  .then(function(firebaseUser) {
    if (!firebaseUser.emailVerified) {
      firebaseUser.sendEmailVerification();
      console.log('Email verification sent');
    }
    $state.go('home');
  })


在我的https://console.firebase.google.com/project/my-app-name/authentication/emails下,一切都是默认的,验证链接为:
Follow this link to verify your email address. https://my-app-name.firebaseapp.com/__/auth/handler?mode=<action>&oobCode=<code>
我用来注册的电子邮件收到了验证电子邮件消息,然而,点击链接并没有将user.emailVerified更改为true。
步骤大纲here是否全部存在,或者还有一个步骤在文档中找不到?

jexiocij

jexiocij1#

正如Tope在评论中提到的,您需要执行firebaseUser.reload(),以便更新对firebaseUser身份验证状态的更改。

agxfikkp

agxfikkp2#

我只是采取了同样的步骤:

auth.currentUser.emailVerified

字符串

auth.currentUser.sendEmailVerification()


1.等待电子邮件
1.单击电子邮件中的链接
1.注销
1.重新登录
然后

auth.currentUser.emailVerified



注意步骤3和4:我需要再次登录,然后才能在我的应用程序中看到emailVerified的新值。您也可以reload用户配置文件,这将强制它刷新服务器中的数据,而不是注销并再次登录。
这个答案看起来也很相关,但我只是在写下上面的内容后才发现的:Firebase确认邮件没有发送

kx1ctssn

kx1ctssn3#

以一种非常简约的方式,这就是我最终得到的:

angular.module('theApp')

.controller('emailVerifyController', ['$scope', '$stateParams', 'currentAuth', 'DatabaseRef',
  function($scope, $stateParams, currentAuth, DatabaseRef) {
    // where currentAuth and DatabaseRef is what they sound like
    $scope.doVerify = function() {
      firebase.auth()
        .applyActionCode($stateParams.oobCode)
        .then(function(data) {

          // change emailVerified for logged in User
          // you can update a DatabaseRef endpoint in here
          // whatever!

          toastr.success('Verification happened', 'Success!');
        })
        .catch(function(error) {
          $scope.error = error.message;
          toastr.error(error.message, error.reason, { timeOut: 0 });
        })
    };
  }
])

字符串
然后在template中,类似这样:

<a ng-click="doVerify()" class="button large">Verify my Account</a>


虽然applyActionCode还没有为AngularFire Package ,但你仍然可以在AngularJS的东西中下拉到SDK的vanilla JavaScript,除此之外,为什么不呢?
我分享了Firebase中电子邮件验证的更多细节:
https://blog.khophi.co/email-verification-firebase-3-0-sdk/

wkftcu5l

wkftcu5l4#

我们刚刚经历了同样的问题,发现修复方法是使用user.reload()函数重新加载用户,并将观察者从onAuthStateChanged更改为onIdTokenChanged
这是因为您正在使用新的emailVerifed属性更新firebase token,而onIdTokenChanged正在侦听Id token的更改,并使用正确的值更新user对象。
代码片段:

export function* register_user(action) {
  try {
    //Call api which registers user and sets email verified to true
    let register_result = yield call(Register_API.create_registration, action.data)

    if (register_result && register_result.status >= 200 && register_result.status < 300) {
      let user = firebase.auth().currentUser
      //Force user to reload so we can trigger the onIdTokenChanged listener
      return user.reload()
    }

  } catch (e) {
    console.error(e)
  }
}

firebase.auth().onIdTokenChanged(function (user) {
      if (user && user.uid) {
        if (user.emailVerified) {
         //Stuff you want to do
        }
      }
    })

字符串

mi7gmzs6

mi7gmzs65#

在我的情况下,似乎currentUser.emailVerified切换到true,但并不总是。不知道为什么。它切换到true与Chrome在大多数情况下,但并不总是。它不与Firefox。
应用reload()方法似乎解决了这个问题。
在加载包含oobCode的URL后,我有以下 Saga :

const currentUser = firebase.auth().currentUser;
if(currentUser){
  currentUser.reload();
}

字符串

y3bcpkx1

y3bcpkx16#

我们只需要在用户点击用户确认链接后重新加载用户的状态。特别是如果有人使用firebase UI登录流程,可能会注意到用户注册和登录是同时执行的。对于这种情况,用户需要通过Sign-Out Sign-In重新认证,这不是一个愉快的体验。但是,Firebase提供了一个重新加载用户的选项。将其放在java-await函数中将确保在执行下一个命令之前刷新状态。

async function confirmEmailVerified(){
    await auth.currentUser.reload();
    var isEmailVerified = auth.currentUser.emailVerified;
    if (isEmailVerified) {
        console.log("Email verified");

    }else{
        console.log("Email not verified, please verify or click on resend to get the verification email!");
    } 
}

字符串

相关问题