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

firebase - get notified when user confirmed an email sent with sendEmailVerification

当用户确认通过 sendEmailVerification 发送的电子邮件时,客户端(网络)是否有办法 know/get 收到通知?

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

似乎 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(如果给定),这里客户端可能会显示一个带有说明('Please check your email for the confirmation link.')的 modal 和一个沙漏
  • 开始一个间隔循环,每秒调用 currentUser.reload(),并在验证成功且 currentUser.emailVerified==true 或发生错误时停止
  • 如果 auth 成功则使用 auth().user 进行解析,否则会因错误而拒绝

用这个你可以做到:

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() 之外的解决方案(至少在应用程序中),除非您注销用户并要求他们在点击电子邮件后重新登录 link.

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