【问题标题】:user.emailVerified doesn't change after clicking email verification link firebase点击电子邮件验证链接firebase后user.emailVerified不会改变
【发布时间】:2016-10-20 09:44:48
【问题描述】:

在学会发送email verification is possible in latest firebase之后,虽然文档中没有,我想自己测试一下。

使用下面的sn-p:

  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 是否全部存在,还是文档中没有其他步骤?

【问题讨论】:

  • 尝试在当前用户上运行reload 方法。 firebaseUser.reload() 应该刷新 emailVerified 变量。

标签: javascript firebase firebase-authentication


【解决方案1】:

正如a comment 中的Tope 所述,您需要执行firebaseUser.reload() 才能更新对firebaseUser 的身份验证状态的更改。

【讨论】:

  • 是的,但是什么时候重新加载?你怎么知道用户访问了电子邮件中的链接?
  • 也许在 15 分钟后添加一个过期时间?
【解决方案2】:

在我的情况下,currentUser.emailVerified 似乎切换到 true,但并非总是如此。不知道为什么。在大多数情况下,它会使用 Chrome 切换到 true,但并非总是如此。它不适用于 Firefox。

应用reload() 方法似乎可以解决问题。

加载包含 oobCode 的 URL 后,我在传奇中有以下内容:

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

【讨论】:

    【解决方案3】:

    我们只需要在用户点击用户确认链接后重新加载用户的状态。特别是如果有人使用 firebase UI 登录流程,可能会注意到用户注册和登录同时执行。对于这样的情况,用户需要通过Sign-Out Sign-In重新认证,这不是一个愉快的体验。但是,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!");
        } 
    }
    

    【讨论】:

    • 我确实试过了,但它仍然显示为错误的电子邮件验证。
    • @carinlynchin 如果您仍在寻找解决方案,请告诉我,也许我可以查看您的代码并为您提供帮助。
    • 我最终没有使用它...我试图使用操作 url...所以我把它拿出来并且验证工作...它用于反应版本
    【解决方案4】:

    我们刚刚遇到了同样的问题,发现修复方法是使用user.reload() 函数重新加载用户,并将观察者从onAuthStateChanged 更改为onIdTokenChanged

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

    代码sn-ps:

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

    【讨论】:

    • 如果您分享您的代码 sn-p 或一些示例代码供其他人参考,将会很有帮助。
    • 同时使用了 await auth().currentUser.reload();等待 auth().currentUser.getIdToken(true)
    • 当前用户重新加载对我不起作用,但获取令牌刷新确实如此。可能是 api 版本,因为不幸的是我们有点过时了
    【解决方案5】:

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

    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/

    【讨论】:

      【解决方案6】:

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

      auth.currentUser.emailVerified
      

      auth.currentUser.sendEmailVerification()
      
      1. 等待邮件
      2. 点击邮件中的链接
      3. 退出
      4. 重新登录

      然后

      auth.currentUser.emailVerified
      

      是的

      注意第 3 步和第 4 步:我需要再次登录,然后emailVerified 的新值才能在我的应用中显示。

      这个答案似乎也很相关,但我只是在写完上面之后才发现它:Firebase confirmation email not being sent

      【讨论】:

      猜你喜欢
      • 2022-10-23
      • 2019-05-20
      • 2019-02-19
      • 2019-04-03
      • 1970-01-01
      • 2018-12-22
      • 1970-01-01
      • 1970-01-01
      • 2018-12-30
      相关资源
      最近更新 更多