【问题标题】:Updating Firebase Authentication password using user.reauthenticate使用 user.reauthenticate 更新 Firebase 身份验证密码
【发布时间】:2020-04-29 12:09:31
【问题描述】:

要在 Firebase 身份验证中更新用户密码,您必须重新进行身份验证:https://firebase.google.com/docs/reference/android/com/google/firebase/auth/FirebaseUser#reauthenticate(com.google.firebase.auth.AuthCredential)

然而,这个函数似乎并没有在实际重新验证之前仔细检查currentPassword 是否正确。我相信这可能是因为 Firebase 直到经过一段时间后才需要重新身份验证,如果仍在该时间范围内,它将绕过此操作。

这是我目前所拥有的:

        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
        AuthCredential credential = EmailAuthProvider
                .getCredential(mAuth.getInstance().getCurrentUser().getEmail(), currentPass.getText().toString());
        user.reauthenticate(credential)
                .addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        Log.d(TAG, "User re-authenticated.");
                        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                        user.updatePassword(newPass1.getText().toString())
                                .addOnCompleteListener(new OnCompleteListener<Void>() {
                                    @Override
                                    public void onComplete(@NonNull Task<Void> task) {
                                                if (task.isSuccessful()) {
                                                    dialog.dismiss();
                                                    Toast.makeText(manageAccount.this, "Password updated!", Toast.LENGTH_LONG).show();
                                                }else {

                                    }
                                        }

                            });
                        }
                    });

似乎currentPass 字段可以完全等于任何值,并且应用程序将继续执行并更改密码。有没有一种方法可以强制 Firebase 实际检查 currentPass 是否等于实际的当前密码?当然,一种方法是在客户端首次登录时保存密码,但这在安全方面当然是非常糟糕的做法。

【问题讨论】:

  • 你不能吗if (currentPass.getText().equals(newPass.getText()))
  • @AbhinavChauhan - 我正在尝试重新验证用户以更改他们的密码,因此 currentPass.getText() 应该等于他们当前的密码(保存在 firebase 中)并且 newPass 是他们的新密码。目前,无论用户在 currentPass 中输入什么,此方法都会重新验证用户,这是错误的。

标签: java android firebase firebase-authentication


【解决方案1】:

这里是 Firebase 团队的马尔科姆!这里有几点需要注意:

  • 在尝试更新密码之前,您需要检查 onCompleteListener 中的任务是否成功。我们肯定正在检查提供的currentPassword 是否正确,但您可能会错过我们在task 中返回的错误:)
  • 要检查reauthenticate() 错误,您可以在当前方法中使用task.isSuccessful(),或者如果您想要更清晰的语义流,您可以将代码拆分为onSuccessListeneronFailureListener
  • 如果您在第一个密码不正确的情况下看到成功(忽略reauthenticate 将失败的事实),那是因为您的用户会话仍然相对较新。我们根据计时器检查会话(现在是 5 分钟,但可能会发生变化),以确保用户在允许他们更新密码或进行其他帐户更改操作之前已登录最近。如果您的首次登录时间足够近,那么重新身份验证失败也没关系,因为currentUser 仍然通过了服务器端计时器检查。

我认为这已经涵盖了它 - 如果您需要更多说明,只需添加评论,我会尽力回复您。

~马尔科姆

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 2021-04-29
    • 2023-01-21
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    相关资源
    最近更新 更多