【问题标题】:How to only send password reset email when the provider is email/password当提供商是电子邮件/密码时,如何仅发送密码重置电子邮件
【发布时间】:2019-09-29 18:28:37
【问题描述】:

我有以下几点:

public void sendEmailToExistingUser(String email) {
    mAuth.sendPasswordResetEmail(email).addOnCompleteListener(task -> {
        if (task.isSuccessful()) emailSent.setValue(true);
    });
}

即使之前注册的用户有不同的提供商,例如 Facebook,任务也会成功。
发送的电子邮件将不会重置 Facebook 登录,以防用户过去使用 Facebook 登录,并且我不想重置 Facebook 密码。

编辑: 我的理解是忘记密码的情况总是在登录之前发生,所以 getCurrentUser() 总是为空。

问题:我可以添加一个条件来避免在提供商 ID 不是 Firebase 电子邮件/密码时发送电子邮件吗?

【问题讨论】:

    标签: android firebase firebase-authentication


    【解决方案1】:

    考虑使用fetchSignInMethodsForEmail。它将为提供的电子邮件查找关联的登录方法。

    但是,请记住,密码重置有时可用于非密码用户作为恢复其帐户的一种手段,或者如果用户忘记了他们之前使用 Google 登录等。您可能可以在用户之前警告他们重置他们之前使用指定的提供商登录。

    【讨论】:

      【解决方案2】:

      是的,您可以检索当前用户并检查他们的提供者。

      public void sendEmailToExistingUser(String email) {
          boolean isEmailPassword = false;
      
          FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
          if (user != null) {
              for (UserInfo profile : user.getProviderData()) {
                  // Id of the provider (ex: google.com)
                  String providerId = profile.getProviderId();
                  if (providerId.equals("password")) {
                      isEmailPassword = true;
                  }
              }
          }
      
          if (isEmailPassword) {
              mAuth.sendPasswordResetEmail(email).addOnCompleteListener(task -> {
                  if (task.isSuccessful()) emailSent.setValue(true);
              });
          }
      }
      
      

      【讨论】:

      • 但如果用户因为忘记密码并尝试重置密码而未签名,则 getCurrentUser() 将始终返回 null,然后 isEmailPassword 将始终为 false。我们可以在用户登录之前获取providerId吗?
      • @RedM 是的,您可以在用户使用 Firebase Admin SDK 登录之前获取providerId。见providerData
      • 这是否意味着它不能从客户端执行?必须从服务器完成?
      • 根据@bojeil 的回答,providerData 不是唯一的选择。 fetchSignInMethodsForEmail 可以检查提供者是 email_password 还是其他东西。这可以从客户端完成。
      猜你喜欢
      • 2023-02-26
      • 2015-11-26
      • 2022-12-31
      • 2010-11-21
      • 2013-12-18
      • 2015-08-13
      • 2018-04-27
      • 2016-03-01
      • 1970-01-01
      相关资源
      最近更新 更多