【问题标题】:firebase - get notified when user confirmed an email sent with sendEmailVerificationfirebase - 当用户确认使用 sendEmailVerification 发送的电子邮件时收到通知
【发布时间】:2016-06-19 22:50:08
【问题描述】:

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

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

【问题讨论】:

    标签: firebase firebase-authentication


    【解决方案1】:

    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(如果给定),客户端应该在此处显示 modal 说明(“请查看您的电子邮件以获取确认链接。”)和沙漏
    • 启动间隔循环,每秒调用 currentUser.reload(),并在使用 currentUser.emailVerified==true 的身份验证成功或发生错误时停止
    • 如果身份验证成功,则使用 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
         }
       );
    }
    

    希望这会有所帮助:)

    【讨论】:

    • 投票:完美答案!
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-05-21
      • 2016-09-22
      • 1970-01-01
      • 2019-06-15
      • 2023-03-20
      • 1970-01-01
      • 2021-01-06
      • 2018-12-05
      • 1970-01-01
      相关资源
      最近更新 更多