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() 相关流量。
当用户确认通过 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() 相关流量。