Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用user.reauthenticate更新Firebase身份验证密码_Java_Android_Firebase_Firebase Authentication - Fatal编程技术网

Java 使用user.reauthenticate更新Firebase身份验证密码

Java 使用user.reauthenticate更新Firebase身份验证密码,java,android,firebase,firebase-authentication,Java,Android,Firebase,Firebase Authentication,要在Firebase身份验证中更新用户密码,必须重新身份验证: 但是,在实际重新验证之前,此函数似乎不会再次检查currentPassword是否正确。我相信这可能是因为Firebase在一段时间后才需要重新验证,如果仍在该时间范围内,则会绕过此过程 到目前为止,我所掌握的情况如下: FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); AuthCredential credential

要在Firebase身份验证中更新用户密码,必须重新身份验证:

但是,在实际重新验证之前,此函数似乎不会再次检查
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 {

                                    }
                                        }

                            });
                        }
                    });
FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser();
AuthCredential credential=EmailAuthProvider
.getCredential(mAuth.getInstance().getCurrentUser().getEmail(),currentPass.getText().toString());
用户重新验证(凭证)
.addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
Log.d(标签“用户重新认证”);
FirebaseUser=FirebaseAuth.getInstance().getCurrentUser();
user.updatePassword(newPass1.getText().toString())
.addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
dialog.dismise();
Toast.makeText(manageAccount.this,“密码已更新!”,Toast.LENGTH_LONG.show();
}否则{
}
}
});
}
});

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

Firebase团队的Malcolm!这里有几点需要注意:

  • 在尝试更新密码之前,您需要检查onCompleteListener中的任务是否成功。我们正在检查提供的
    currentPassword
    是否正确,但您可能缺少我们在
    任务中返回的错误:)
  • 要检查
    reaauthenticate()
    错误,您可以在当前方法中使用
    task.issessful()
    ,或者如果您想要更清晰的语义流,可以将代码拆分为
    onSuccessListener
    onFailureListener
  • 如果您在第一个密码不正确的情况下看到了成功(忽略了
    重新验证将失败的事实),那是因为您的用户会话仍然相对较新。我们根据计时器检查会话(现在是5分钟,但可能会更改),以确保用户最近登录,然后允许他们更新密码或执行其他帐户更改操作。如果您的第一次登录足够晚,那么重新验证失败也无关紧要,因为
    currentUser
    仍然通过服务器端计时器检查
我想这就涵盖了它-如果你需要任何更多的澄清,只需添加一条评论,我会尽力回复你


~Malcolm

如果(currentPass.getText().equals(newPass.getText())
@AbhinavChauhan-我正在尝试重新验证用户身份以更改其密码,因此currentPass.getText()应等于其当前密码(保存在firebase中),而newPass是其新密码。目前,无论用户在currentPass中键入什么,此方法都会重新验证用户,这是错误的。