Android 如何仅在提供商为电子邮件/密码时发送密码重置电子邮件

Android 如何仅在提供商为电子邮件/密码时发送密码重置电子邮件,android,firebase,firebase-authentication,Android,Firebase,Firebase Authentication,我有以下资料: public void sendEmailToExistingUser(String email) { mAuth.sendPasswordResetEmail(email).addOnCompleteListener(task -> { if (task.isSuccessful()) emailSent.setValue(true); }); } 即使以前注册的用户有不同的提供商,例如Facebook,任务也会成功。 如果用户过去使用f

我有以下资料:

public void sendEmailToExistingUser(String email) {
    mAuth.sendPasswordResetEmail(email).addOnCompleteListener(task -> {
        if (task.isSuccessful()) emailSent.setValue(true);
    });
}
即使以前注册的用户有不同的提供商,例如Facebook,任务也会成功。
如果用户过去使用facebook登录,则发送的电子邮件不会重置facebook登录,我不想重置facebook密码

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


问题:我是否可以添加一个条件,以避免在提供商id不是firebase电子邮件/密码时发送电子邮件

是的,您可以检索当前用户并检查其提供程序

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);
        });
    }
}


是的,您可以检索当前用户并检查其提供程序

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);
        });
    }
}

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

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

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

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
。看,这是否意味着它不能从客户端执行?必须从服务器上完成?根据@bojeil的回答,providerData不是唯一的选项。FetchSigningMethodsForEmail可以检查提供程序是否为电子邮件\u密码或其他内容。这可以从客户端完成。但如果用户由于忘记密码并试图重置密码而未签名,则getCurrentUser()将始终返回null,而isEmailPassword将始终为false。我们可以在用户登录之前获取providerId吗?@RedM是的,您可以在用户使用Firebase Admin SDK登录之前获取
providerId
。看,这是否意味着它不能从客户端执行?必须从服务器上完成?根据@bojeil的回答,providerData不是唯一的选项。FetchSigningMethodsForEmail可以检查提供程序是否为电子邮件\u密码或其他内容。这可以从客户端完成。
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);
        });
    }
}