Firebase 身份验证 Web:如何验证电子邮件地址
Firebase authentication web: how to verify email address
我是网络 Firebase 身份验证的新手。我设法让注册表单正常工作,但我 运行 遇到了发送电子邮件以验证用户电子邮件地址的问题。用户正常创建并出现在我的控制台中,但没有发送验证电子邮件并且
我在 Chrome 中收到以下错误:
Uncaught TypeError: Cannot read property 'sendEmailVerification' of null
这是我目前的代码:
"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
})();
firebase.auth().currentUser 将是 null/undefined,直到您通过身份验证。请尝试按以下所述发送电子邮件。
firebase.auth().onAuthStateChanged(function (firebaseUser) {
if (firebaseUser) {
firebaseUser.sendEmailVerification().then(function() {
// Email sent.
}, function(error) {
// An error happened.
})
....
} else {
....
}
});
@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.
})`
// 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
returns authData 所以你需要authData,用户发送邮件验证。
我是网络 Firebase 身份验证的新手。我设法让注册表单正常工作,但我 运行 遇到了发送电子邮件以验证用户电子邮件地址的问题。用户正常创建并出现在我的控制台中,但没有发送验证电子邮件并且 我在 Chrome 中收到以下错误:
Uncaught TypeError: Cannot read property 'sendEmailVerification' of null
这是我目前的代码:
"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
})();
firebase.auth().currentUser 将是 null/undefined,直到您通过身份验证。请尝试按以下所述发送电子邮件。
firebase.auth().onAuthStateChanged(function (firebaseUser) {
if (firebaseUser) {
firebaseUser.sendEmailVerification().then(function() {
// Email sent.
}, function(error) {
// An error happened.
})
....
} else {
....
}
});
@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.
})`
// 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
returns authData 所以你需要authData,用户发送邮件验证。