Java 使用user.reauthenticate更新Firebase身份验证密码
要在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
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中键入什么,此方法都会重新验证用户,这是错误的。