单击电子邮件验证链接firebase后,user.emailVerified不会更改

时间:2016-06-18 18:43:44

标签: javascript firebase firebase-authentication

在学习发送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所有内容,还是在文档中找不到另一个步骤?

6 个答案:

答案 0 :(得分:4)

如@Tope评论,您需要执行firebaseUser.reload()以更新firebaseUser的身份验证状态。

答案 1 :(得分:2)

我采取了同样的步骤:

auth.currentUser.emailVerified
  

auth.currentUser.sendEmailVerification()
  1. 等待电子邮件
  2. 点击电子邮件中的链接
  3. 退出
  4. 再次登录
  5. 然后

    auth.currentUser.emailVerified
    
      

    注意步骤3和4:在我的应用中显示emailVerified的新值之前,我需要再次登录。

    这个答案似乎也很重要,但我在写完上述内容后才发现它:Firebase confirmation email not being sent

答案 2 :(得分:2)

以非常简约的方式,这就是我最终的结果:

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 });
        })
    };
  }
])

然后在模板中,像这样:

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

虽然applyActionCode尚未包含在AngularFire中,但您仍然可以在AngularJS中删除SDK的vanilla Javascript,此外,为什么不呢!

我在Firebase中分享了有关电子邮件验证的更多详细信息:
https://blog.khophi.co/email-verification-firebase-3-0-sdk/

答案 3 :(得分:0)

我们刚刚经历了同样的问题,发现解决方法是既使用def make_bricks(ones, fives, length): total_fives = 5 * fives fives_needed = length // 5 if ones>=length or length%5 ==0 and total_fives >=length: return True elif fives_needed<=fives and (length - fives_needed * 5)<=ones: return True elif fives_needed>fives and total_fives + ones >= length: return True else: return False make_bricks(3, 1, 8) True make_bricks(3, 1, 9) False make_bricks(3, 2, 10) True 函数重新加载用户,又将观察者从user.reload()更改为onAuthStateChanged

这是因为您正在使用新的onIdTokenChanged属性更新firebase令牌,而emailVerifed正在侦听对ID令牌的更改,并使用正确的值更新用户对象。

代码段:

onIdTokenChanged

答案 4 :(得分:0)

我们只需要在用户单击用户确认链接后重新加载用户的状态即可。尤其是如果有人在使用Firebase UI登录流程,则可能已经注意到用户登录和登录同时执行。对于这种情况,需要通过注销登录来重新认证用户,这不是一种令人愉快的体验。但是,Firebase提供了重新加载用户的选项。将其放在async-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!");
    } 
}

答案 5 :(得分:0)

就我而言,似乎(base) [xushan@int2 southfr_exp]$ srun job_spinup.sh southfr_exp 1 & [1] 11570 (base) [xushan@int2 southfr_exp]$ srun: job 8860513 queued and waiting for resources srun: job 8860513 has been allocated resources *************************************** CONDA ENV ACTIVATED FOR NCO COMMAND *************************************** 20 ./job_spinup.sh: line 62: ulimit: open files: cannot modify limit: Operation not permitted *************************************** READY TO START SPINUP on tcn991.bullx spinup 20 0:1 *************************************** ------------------ SPINUP : 0 / 20 199601 1 199602 1 199603 1 199604 1 199605 1 199606 1 199607 1 199608 1 199609 1 199610 1 199611 1 199612 1 ------------------ ------------------ SPINUP : 1 / 20 199601 1 199602 1 199603 1 199604 1 199605 1 199606 1 199607 1 199608 1 199609 1 199610 1 srun: Force Terminated job 8860513 srun: Job step aborted: Waiting up to 32 seconds for job step to finish. slurmstepd: error: *** STEP 8860513.0 ON tcn991 CANCELLED AT 2020-09-07T12:51:24 DUE TO TIME LIMIT *** srun: error: tcn991: task 0: Terminated srun: Terminating job step 8860513.0 切换到currentUser.emailVerified,但并非总是如此。不知道为什么。在大多数情况下,Chrome会切换为true,但并非总是如此。 Firefox不支持。

应用true方法似乎可以解决此问题。

在加载包含oobCode的URL之后,我有了一个传奇:

reload()