【问题标题】:Firebase authentication web: how to verify email addressFirebase 身份验证网站:如何验证电子邮件地址
【发布时间】:2017-05-17 12:17:37
【问题描述】:

我是网络版 Firebase 身份验证的新手。我设法使注册表单正常工作,但在发送电子邮件以验证用户电子邮件地址时遇到了问题。用户正常创建并出现在我的控制台中,但未发送验证电子邮件,并且 我在 Chrome 中收到以下错误:

未捕获的 TypeError:无法读取 null 的属性“sendEmailVerification”

这是我目前的代码:

"use strict";

(function () {

    // initialize firebase
    var config = {
        apiKey: "//api key",
        authDomain: "// etc",
        databaseURL: "// etc",
        projectId: "// etc",
        storageBucket: "// etc",
        messagingSenderId: "// etc"
    };
    firebase.initializeApp(config);

    // get the login form elements from HTML
    var txtEmail = document.getElementById('txtEmail');
    var txtPassword = document.getElementById('txtPassword');
    var btnLogin = document.getElementById('btnLogin');
    var btnSignUp = document.getElementById('btnSignUp');
    var btnLogout = document.getElementById('btnLogout');

    // add login event
    btnLogin.addEventListener('click', function (e) {
        // get email and pass
        var email = txtEmail.value;
        var pass = txtPassword.value;
        var auth = firebase.auth();
        // sign in 
        var promise = auth.signInWithEmailAndPassword(email, pass);
        promise.catch(function (e) {
            return console.log(e.message);
        });
    });

    // add signup event. the signup button sends user email and pass to firebase
    btnSignUp.addEventListener('click', function (e) {
        // get email and pass
        // TODO: validate email - check it is real
        var email = txtEmail.value;
        var pass = txtPassword.value;
        var auth = firebase.auth();
        var user = firebase.auth().currentUser;

        // sign in 
        var promise = auth.createUserWithEmailAndPassword(email, pass);
        promise.catch(function (e) {
            return console.log(e.message);
        }).then(function(){user.sendEmailVerification().then(function() {
          // Email sent.
        }, function(error) {
          // An error happened.
        })
                          }); // end verification
    }); // end sign up button event listener

    // show logout button when user is logged in
    // TODO: make sure the login form clears the credentials on logout
    btnLogout.addEventListener('click', function (e) {
        firebase.auth().signOut();
    });

    // realtime authentication listener
    firebase.auth().onAuthStateChanged(function (firebaseUser) {
        if (firebaseUser) {
            console.log(firebaseUser);
            btnLogout.classList.remove('hide');
            btnSignUp.classList.add('hide');
            btnLogin.classList.add('hide');
        } else {
            console.log('not logged in');
            btnLogout.classList.add('hide');
            btnSignUp.classList.remove('hide');
            btnLogin.classList.remove('hide');
        } // end if statement
    }); // end function
})();

我还没有找到一个简单的例子来说明如何做到这一点,文档只提供了代码,但没有关于放置位置的信息。我感谢您的帮助。谢谢。

已解决: 谢谢您的帮助。它现在正在工作。这是完整的工作代码:

"use strict";

(function () {

// initialize firebase 
 var config = {
 apiKey: "",
 authDomain: "",
 databaseURL: "",
 projectId: "",
 storageBucket: "",
 messagingSenderId: ""
 };
 firebase.initializeApp(config);

// get the login form elements from HTML
 var txtEmail = document.getElementById('txtEmail');
 var txtPassword = document.getElementById('txtPassword');
 var btnLogin = document.getElementById('btnLogin');
 var btnSignUp = document.getElementById('btnSignUp');
 var btnLogout = document.getElementById('btnLogout');

// login event
 btnLogin.addEventListener('click', function (e) {
 // get email and pass
 var email = txtEmail.value;
 var pass = txtPassword.value;
 var auth = firebase.auth();
 // sign in
 var promise = auth.signInWithEmailAndPassword(email, pass);
 promise.catch(function (e) {
 return console.log(e.message);
 });
 });

// add signup event. the signup button sends user email and pass to firebase
 btnSignUp.addEventListener('click', function (e) {
 // get email and pass
 // TODO: validate email - check it is real
 var email = txtEmail.value;
 var pass = txtPassword.value;
 var auth = firebase.auth();
 var user = firebase.auth().currentUser;

// create user and sign in
 var promise = auth.createUserWithEmailAndPassword(email, pass);
 promise.then(function(user) {
 user.sendEmailVerification().then(function() {
 // Email sent.
 }, function(error) {
 // An error happened.
 });
 }); 
 }); // end sign up button event listener

// show logout button when user is logged in
 btnLogout.addEventListener('click', function (e) {
 firebase.auth().signOut();
 });

// realtime authentication listener
 firebase.auth().onAuthStateChanged(function (firebaseUser) {
 if (firebaseUser) {
 console.log(firebaseUser);
 btnLogout.classList.remove('hide');
 btnSignUp.classList.add('hide');
 btnLogin.classList.add('hide');
 } else {
 console.log('not logged in');
 btnLogout.classList.add('hide');
 btnSignUp.classList.remove('hide');
 btnLogin.classList.remove('hide');
 } // end else statement
 }); // end function
 })();

【问题讨论】:

    标签: javascript email firebase firebase-authentication verification


    【解决方案1】:

    firebase.auth().currentUser 将是 null/undefined,直到您通过身份验证。请尝试如下所述发送电子邮件。

    firebase.auth().onAuthStateChanged(function (firebaseUser) {
            if (firebaseUser) {
              firebaseUser.sendEmailVerification().then(function() {
                // Email sent.
              }, function(error) {
                // An error happened.
              })
                ....
    
            } else {
                ....
            }
        });
    

    【讨论】:

    • 感谢您的帮助。我已经让它工作了。这是我更改的内容: // 创建用户并登录 var promise = auth.createUserWithEmailAndPassword(email, pass); promise.then(function(user) { user.sendEmailVerification().then(function() { // 电子邮件已发送。 }, function(error) { // 发生错误。 }); }); // 结束承诺 }); // 结束注册按钮事件监听
    【解决方案2】:

    // sign in 
    var promise = auth.createUserWithEmailAndPassword(email, pass);
    promise.then(function(authData) {// You are forgetting this reference.
        authData.user.sendEmailVerification();
    }, function(error) {
        // An error happened.
    })

    createUserWithEmailAndPassword 返回 authData 所以你需要 authData,user 发送邮件验证。

    【讨论】:

      【解决方案3】:

      @Nagaraj N 的解决方法是正确的,你也可以修改你的代码如下:

          // sign in 
          var promise = auth.createUserWithEmailAndPassword(email, pass);
          promise.then(function(user) {// You are forgetting this reference.
            user.sendEmailVerification();
            // You can also call this.
            firebase.auth().currentUser.sendEmailVerification();
            // Email sent.
          }, function(error) {
            // An error happened.
          })`
      

      【讨论】:

      • 谢谢,该代码有效。这是我更新后的代码: // 创建用户并登录 var promise = auth.createUserWithEmailAndPassword(email, pass); promise.then(function(user) { user.sendEmailVerification().then(function() { // 电子邮件已发送。 }, function(error) { // 发生错误。 }); }); // 结束承诺 }); // 结束注册按钮事件监听
      • 奇怪,promise 返回的user 包含sendEmailVerification() 方法的“真实”user。这是预期的行为吗?所以 tborja 的答案对我有用...
      • 嗯,Erin B. 使用的这个例子已经过时了。这是使用旧版本的 SDK,其中 createUserWithEmailAndPassword 使用 User 对象解析。更高版本现在使用 UserCredential 对象解析。
      猜你喜欢
      • 2018-02-10
      • 2023-03-18
      • 2021-03-26
      • 1970-01-01
      • 2018-06-15
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      相关资源
      最近更新 更多