当前位置: 首页 > 知识库问答 >
问题:

如何防止在Firebase/Vue.js中验证邮件前进行用户验证

焦学海
2023-03-14

我正在建立一个Vue.js/Firebase认证界面,其中包括一个电子邮件验证组件。到目前为止,我已经能够成功地设置我的界面,以便阻止用户登录,直到他/她单击发送到与输入地址相关的收件箱的电子邮件中的验证链接。但是,我注意到,即使在单击验证电子邮件中的链接之前,该电子邮件地址仍然显示在Firebase身份验证门户中。假邮件地址似乎也是如此,显然无法核实。我真的希望只有在单击验证电子邮件中的链接后,电子邮件地址才会显示在身份验证门户中。我怎样才能实现这一点?这是我当前的代码。谢谢!

<template>
  <div>
    <div class="container">
      <input type="email" id="txtEmail" v-model="authInput.txtEmail" placeholder="Email">
      <input type="Password" id="txtPassword" v-model="authInput.txtPassword" placeholder="Password">
    </div>

    <div class="container">
      <button id="btnLogin" v-on:click="Login()">Log in</button>
      <button id="btnSignUp" v-on:click="SignUp()">Sign Up</button>
      <button id="btnLogout" v-on:click="LogOut()" style="display:none">Log out</button>
    </div>
    <p id="verifyMessage"></p>
  </div>
</template>
<script>
    import Firebase from 'firebase'
    export default {
        data() {
            return {
                authInput: {
                    txtEmail: '',
                    txtPassword: ''
                }
            }
        },
        methods: {
            Login: function(event) {
                const email = this.authInput.txtEmail;
                const pass = this.authInput.txtPassword;
                const auth = Firebase.auth();
                const promise = auth.signInWithEmailAndPassword(email, pass);
                this.authInput.txtEmail = '';
                this.authInput.txtPassword = '';
                promise.catch(event => console.log(event.message));

                auth.onAuthStateChanged(newUser => {
                  if (newUser) {
                      if (newUser.emailVerified == true) {
                          console.log('login success');
                          document.getElementById('btnLogout').style.display = '';
                          document.getElementById('btnLogin').style.display = 'none';
                          document.getElementById('btnSignUp').style.display = 'none';
                          document.getElementById("verifyMessage").innerHTML = "You are now logged in!";
                      } else {
                          document.getElementById('btnLogout').style.display = 'none';
                      }
                  } else {
                      console.log('not logged in');
                      document.getElementById('btnLogout').style.display = 'none';
                      document.getElementById('btnLogin').style.display = '';
                      document.getElementById('btnSignUp').style.display = '';
                  }
                })
            },
            SignUp: function(event) {
                const email = this.authInput.txtEmail;
                const pass = this.authInput.txtPassword;
                const auth = Firebase.auth();
                const promise = auth.createUserWithEmailAndPassword(email, pass);
                this.authInput.txtEmail = '';
                this.authInput.txtPassword = '';
                promise.catch(event => console.log(event.message));

                auth.onAuthStateChanged(firebaseUser => {
                    if (firebaseUser) {
                        firebaseUser.sendEmailVerification().then(function() {
                            console.log('send Verification');
                            document.getElementById("verifyMessage").innerHTML = "Check your inbox for verification email!";
                        }, function(error) {
                            console.log('not send Verification');
                        });
                    } else {
                        console.log('not logged in');
                        document.getElementById('btnLogout').style.display = 'none';
                    }
                })
            },
            LogOut: function() {
                Firebase.auth().signOut();
                document.getElementById("verifyMessage").innerHTML = "You are now logged out!";
            }
        }
    }
</script>
<style media="screen">
  .container {
    margin: 10px;
  }
</style>

共有1个答案

翟泰
2023-03-14

这个问题已经讨论过很多次了:目前没有办法阻止用户使用未经验证的电子邮件地址登录。但是您可以在客户端代码和后端代码(或安全规则)中检查验证状态,以确保只有经过验证的电子邮件地址的用户才能访问您的资源。

参见:

  • 如何将Firebase数据库锁定给来自特定(电子邮件)域的任何用户
  • Firebase防止在电子邮件验证之前创建帐户。
  • 更类似的问题
 类似资料:
  • 创建新用户时,我需要注销他们,然后发送验证电子邮件,以确保他们拥有电子邮件地址。目前,我的代码创建用户并执行“sendEmailVerification”调用,但保持用户登录。如何注销我的用户并检查他们是否验证了电子邮件?

  • 问题内容: 我检查了用户是否通过电子邮件验证。但是,无论我发送并确认了多少电子邮件,验证状态仍为。检查时我做错什么了吗? 问题答案: 我如何实现此功能的方法是添加一个 带有时间间隔的,它将检查用户是否已通过验证,然后在完成验证后终止计时器。 检查您当前用户状态的功能:

  • 我检查了用户是否通过电子邮件进行验证。但是,无论我发送并确认了多少封电子邮件,验证状态仍然是。我在检查时是否做错了什么?

  • 我可以在用户注册后发送一封验证邮件,但是用户会自动登录。在用户验证其电子邮件之前,我如何阻止他们登录?

  • 在用户注册Firebase之前,我应该如何验证电子邮件地址?我知道电子邮件地址已通过,但这仅适用于当前用户。因此,必须在发送验证电子邮件之前创建用户。这不会有多大帮助,因为您显然必须在将电子邮件添加到数据库之前验证它。因此,什么是好的解决方法?

  • 我正在提示我的应用程序用户提供电子邮件凭据。 在用户插入电子邮件并通过后,我想验证该帐户。 我正在使用javax。邮政有没有办法验证帐户?只确保凭据确实有效——否则我想显示一个无效用户并传递消息。 也许是某种表演方式: 并在不发送任何内容的情况下检查身份验证异常。