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

kof*_*fus 8 firebase firebase-authentication

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

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

kof*_*fus 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);
            }
        );
    });
}
Run Code Online (Sandbox Code Playgroud)

代码将:

  • 调用createUserWithEmailAndPassword
  • 调用sendEmailVerification
  • 调用showWaitUI(如果给出),这里客户端应该显示带有说明的模态('请检查您的电子邮件以获取确认链接.')和沙漏
  • 启动一个间隔循环,每秒调用一次currentUser.reload(),并在auth成功时使用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
     }
   );
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助 :)