firebase - 当用户确认使用sendEmailVerification发送的电子邮件时收到通知

时间:2016-06-19 22:50:09

标签: firebase firebase-authentication

当用户确认使用sendEmailVerification发送的电子邮件时,客户端(网站)是否有办法知道/获得通知?

这对于单个页面应用程序等待,然后在用户确认并完成身份验证后将状态更改为已登录非常重要。

2 个答案:

答案 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);
            }
        );
    });
}

代码将:

  • 调用createUserWithEmailAndPassword
  • 调用sendEmailVerification
  • 调用showWaitUI(如果给定),此处客户端应该显示带有说明的模态('请检查您的电子邮件以获取确认链接。')和沙漏
  • 启动一个间隔循环,每秒调用一次currentUser.reload(),并在使用currentUser.emailVerified == true或发生错误的auth成功时停止
  • 使用auth()。用户解析如果auth成功,则拒绝错误

你可以这样做:

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()相关的流量。