当用户确认使用sendEmailVerification发送的电子邮件时,客户端(网站)是否有办法知道/获得通知?
这对于单个页面应用程序等待,然后在用户确认并完成身份验证后将状态更改为已登录非常重要。
答案 0 :(得分:7)
似乎FireBase没有直接的方式让客户端在验证电子邮件时收到通知,并且此类界面“目前尚未被考虑”。
我提出了以下解决方案:
function registerUserAndWaitEmailVerification(email, password, showWaitUI) {
return new Promise(function(resolve, reject) {
let interval=null;
firebase.auth().createUserWithEmailAndPassword(email, password).then(
user => {
user.sendEmailVerification().then(
() => {
if (showWaitUI) showWaitUI();
interval = setInterval(() => {
user.reload().then(
() => {
if (interval && user.emailVerified) {
clearInterval(interval);
interval=null;
resolve(user);
}
}, error => {
if (interval) {
clearInterval(interval);
interval=null;
console.log('registerUserAndWaitEmailVerification: reload failed ! '+error.message+' ('+error.code+')');
reject(error);
}
}
);
}, 1000);
}, error => {
console.log('registerUserAndWaitEmailVerification: sendEmailVerification failed ! '+error.message+' ('+error.code+')');
reject(error);
});
}, error => {
console.log('registerUserAndWaitEmailVerification: createUserWithEmailAndPassword failed ! '+error.message+' ('+error.code+')');
reject(error);
}
);
});
}
代码将:
你可以这样做:
function showRegisterUI() {
// show a modal with instructions ('Please check your email for the confirmation link.') and an hourglass
}
registerUserAndWaitEmailVerification(email, password, showRegisterUI).then(
user => {
// uid in user.uid
, error => {
// alert user with error.message, go back to login screen
}
);
}
希望这会有所帮助:)
答案 1 :(得分:0)
请记住,调用reload()会导致客户端和Firebase服务器之间的通信-每秒调用一次可能比您要创建的通信要多得多。不过,如果您有很多注册,这可能只是个问题。
但是,除非调用用户reload(),否则我不知道(至少在应用程序中)解决方案,除非您注销用户并要求他们在单击电子邮件链接后重新登录。
我使用的解决方案是在注册后指示用户单击电子邮件中的链接,然后单击继续。当他们单击继续时,请执行reload(),然后在重新加载的onComplete()回调中,检查是否已收到电子邮件验证。如果没有,他们会收到一条消息并停留在同一屏幕上。这样,仅当用户执行操作时,我才获得与reload()相关的流量。