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

firebase-当用户确认通过sendEmailVerification发送的电子邮件时收到通知,firebase,firebase-authentication,Firebase,Firebase Authentication,当用户确认通过sendEmailVerification发送的电子邮件时,客户端(web)是否有办法知道/得到通知 这对于单页应用程序来说很重要,在用户确认并完成身份验证后等待,然后将状态更改为登录。FireBase似乎没有一种直接的方式让客户端在验证电子邮件时收到通知,并且这种接口“目前未被考虑” 我提出了以下解决方案: function registerUserAndWaitEmailVerification(email, password, showWaitUI) { return

当用户确认通过sendEmailVerification发送的电子邮件时,客户端(web)是否有办法知道/得到通知


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

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);
            }
        );
    });
}
守则将:

  • 使用Email和Password调用CreateUsers
  • 呼叫发送电子邮件验证
  • 呼叫showWaitUI(如果给出),客户应在此处显示一个带有说明的模式(“请检查您的电子邮件中的确认链接”)和一个沙漏
  • 每秒启动一个调用currentUser.reload()的间隔循环,并在使用currentUser.emailVerified==true进行身份验证成功或发生错误时停止
  • 使用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
     }
   );
}

希望这对您有所帮助:)

请记住,调用reload()会导致客户端和Firebase服务器之间的通信量-每秒调用一次可能会产生比您想要的多得多的通信量。不过,这可能只是一个问题,如果你有很多注册的话

但是,我不知道除了调用reload()之外还有什么解决方案(至少在应用程序中),除非您注销用户并要求他们在单击电子邮件链接后重新登录


我使用的解决方案是,在注册后,指示用户单击电子邮件中的链接,然后单击“继续”。单击“继续”后,执行重新加载(),并在重新加载的onComplete()回调中,检查是否已收到电子邮件验证。如果没有,他们会收到一条消息并停留在同一屏幕上。这样,只有当用户执行某个操作时,我才有与reload()相关的流量。

投票:完美答案!