调用“发送密码重置电子邮件”方法时,防止Firebase出现“找不到电子邮件”错误

时间:2018-10-16 00:29:25

标签: javascript firebase firebase-authentication

我正在为我的Web应用程序使用Firebase身份验证和Javascript客户端库,以允许用户登录和注销。我已经实现了“忘记密码”表单,以允许用户重设密码。提交此表单时,它将调用sendPasswordResetEmail方法。一切正常,密码已成功重置。

handleSubmit = event => {
    event.preventDefault();
    firebase.auth().sendPasswordResetEmail(this.state.email)
      .then(() => {
        console.log("Success");
      })
      .catch(() => {
        console.log("Shhhhh");
      });
  };

但是,如果我输入尚未注册的电子邮件,则会收到控制台错误,该错误记录了Firebase的400响应。开发工具中的“网络”标签基本上说明未找到该电子邮件。我的理解是,向用户提供此信息通常被认为是不良的安全做法(如果我错了,请纠正我)。捕获错误(如我在上面所做的尝试)不会阻止此信息的记录。我还在生产环境中运行了代码,并得到了相同的结果。

这使我想到在调用sendPasswordResetEmail方法之前应先检查电子邮件。但是,在SO中寻找类似问题时,似乎并没有商定在注册流程之外检查用户是否存在的最佳方法。您可以使用Admin SDK检查用户是否存在,但这需要特权环境(例如服务器)。

因此,我想我的主要问题有两个:我可以/应该禁止来自firebase sendPasswordResetEmail方法的“未找到电子邮件”错误消息吗?如果是,怎么办?如果不是,确定电子邮件地址是否已用于登录Firebase应用程序的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

非常感谢@Alchemist Shahed,他向我指出了fetchSignInMethodsForEmail方法,该方法返回给定电子邮件的登录方法数组。如果数组为空,则它们尚未登录。我将上面的代码修改为如下所示:

handleSubmit = event => {
    event.preventDefault();
    firebase.auth().fetchSignInMethodsForEmail(this.state.email)
    .then(result => {
      if (result.length > 0) {
        firebase.auth().sendPasswordResetEmail(this.state.email).catch((error) => {
          console.log("Error Sending Email", error);
        });
      }
    .catch((error) => {
      console.log("Error Reaching Firebase: ", error);
    });
  };

顺便说一句,Admin SDK显然没有sendPasswordResetEmail方法。但是,如果您希望从API调用sendPasswordResetEmail,则可以在服务器as described in this answer.

上同时使用Javascript SDK和Node.js SDK。