【发布时间】:2016-06-19 22:50:08
【问题描述】:
当用户确认使用 sendEmailVerification 发送的电子邮件时,客户端(网络)是否有办法知道/得到通知?
这对于单页应用程序在用户确认和身份验证完成后等待然后将状态更改为已登录非常重要。
【问题讨论】:
标签: firebase firebase-authentication
当用户确认使用 sendEmailVerification 发送的电子邮件时,客户端(网络)是否有办法知道/得到通知?
这对于单页应用程序在用户确认和身份验证完成后等待然后将状态更改为已登录非常重要。
【问题讨论】:
标签: firebase firebase-authentication
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);
}
);
});
}
代码将:
你可以这样做:
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() 之外的解决方案(至少在应用程序中),除非您注销用户并要求他们在单击电子邮件链接后重新登录。
我使用的解决方案是指示用户在注册后单击电子邮件中的链接,然后单击继续。当他们点击 continue 时,执行 reload(),并在 reload 的 onComplete() 回调中检查是否收到了电子邮件验证。如果没有,他们会收到一条消息并留在同一屏幕上。这样,只有当用户执行操作时,我才有 reload() 相关的流量。
【讨论】: