【问题标题】:Android studio firbase change password validate form errorAndroid studio firebase 更改密码验证表单错误
【发布时间】:2020-01-15 02:39:28
【问题描述】:

您好,我只想匹配 2 个字段,如果它们匹配我想将其中 1 个发送到 firebase。这是用于更改密码。但是我收到错误,它立即进入 else 语句:“出了点问题,密码没有被更改”。无法理解为什么。

现在如果 2 个密码不匹配,我会收到消息:两个字段都匹配 这部分是对的

当 2 场比赛出现问题时:这就是 firebase 的 public void oncomplete 的 else 语句。如果任务成功,它只是跳过,我不明白为什么。

public void changePassword(){
   String userPasswordNew = newPassword.getText().toString(); // get pw
    String userPassword2New = newPassword2.getText().toString();

    if (userPasswordNew.equals(userPassword2New)){

        if(userPasswordNew.equals("") || userPassword2New.equals("")){
            Toast.makeText(ProfilePasswordUpdateActivity.this,"Fields can not be empty", Toast.LENGTH_SHORT).show();
        }

        else {
            firebaseUser.updatePassword(userPasswordNew).addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if(task.isSuccessful()){
                        Toast.makeText(ProfilePasswordUpdateActivity.this,"Password changed",Toast.LENGTH_SHORT).show();
                        finish();
                    }else{
                        Toast.makeText(ProfilePasswordUpdateActivity.this,"Something went wrong, password did not get changed",Toast.LENGTH_LONG).show();
                    }
                }
            });
        }

    }
    else{
        Toast.makeText(ProfilePasswordUpdateActivity.this,"Both fields much match in order to change password",Toast.LENGTH_LONG).show();
    }

}

输入的 xml 绑定

 newPassword = findViewById(R.id.EditText_new_password);
 newPassword2 = findViewById(R.id.EditText_new_password2);

错误

2020-01-15 08:57:44.007 11071-11071/com.example.examapplikation E/AndroidRuntime: FATAL EXCEPTION: main 进程:com.example.examapplikation,PID:11071 java.lang.NullPointerException:尝试在空对象上调用虚拟方法“com.google.android.gms.tasks.Task com.google.firebase.auth.FirebaseUser.reauthenticate(com.google.firebase.auth.AuthCredential)”参考 在 com.example.examapplikation.ProfilePasswordUpdateActivity.changePassword(ProfilePasswordUpdateActivity.java:66) 在 com.example.examapplikation.ProfilePasswordUpdateActivity$1.onClick(ProfilePasswordUpdateActivity.java:50) 在 android.view.View.performClick(View.java:6597) 在 android.view.View.performClickInternal(View.java:6574) 在 android.view.View.access$3100(View.java:778) 在 android.view.View$PerformClick.run(View.java:25885) 在 android.os.Handler.handleCallback(Handler.java:873) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:193) 在 android.app.ActivityThread.main(ActivityThread.java:6669) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

【问题讨论】:

  • 我的猜测是它抛出了 FirebaseAuthRecentLoginRequiredException,您能否添加您获得的堆栈跟踪或确认这是问题所在?如果是这种情况,我会解释一个简单的解决方法。
  • 如何添加这个?堆栈跟踪
  • 实际上它在我添加第二个 if 语句之前就起作用了,我还检查字段是否为空,而不仅仅是两个输入是否相等。但是,如果某些内容为空但在两个字段相等时成功更改密码,则会崩溃。但是现在它直接进入到 firebase 的 changepassword 函数中的 else 语句。
  • 抱歉,这还不够,尝试编辑问题并完全添加它,或者只是搜索其中是否出现 FirebaseAuthRecentLoginRequiredException。从你所说的听起来这将是问题,但我更愿意在写答案之前确定,所以请检查
  • 但是我创建的 if 语句看起来如何。它是正确的还是我在其中犯了一些逻辑错误?

标签: java android firebase firebase-realtime-database logic


【解决方案1】:

希望这会对您有所帮助。正如nilsi's SO answer 所说,您需要重新验证用户才能更改密码。我对您的逻辑进行了更改,这可能会对您有所帮助。只需在更改密码之前重新验证用户身份即可。

String userPasswordNew = newPassword.getText().toString();
String userPassword2New = newPassword2.getText().toString();

if(!userPasswordNew.equals("") && !userPassword2New.equals("")){
    if(userPasswordNew.equals(userPassword2New)){
        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
        AuthCredential credential = EmailAuthProvider
                .getCredential("user@example.com", "password1234");
        user.reauthenticate(credential)
                .addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        if (task.isSuccessful()) {
                            user.updatePassword(userPasswordNew).addOnCompleteListener(new OnCompleteListener<Void>() {
                                @Override
                                public void onComplete(@NonNull Task<Void> task) {
                                    if (task.isSuccessful()) {
                                        Log.d(TAG, "Password updated");
                                    } else {
                                        Log.d(TAG, "Error password not updated")
                                    }
                                }
                            });
                        } else {
                            Log.d(TAG, "Error auth failed")
                        }
                    }
                });
    }else{
        Log.d("Password", "Does Not Match");
    }
}else{
    Log.d("Password", "Fill the Edittext");
}

【讨论】:

  • 你好,我的应用程序因此崩溃了。顺便说一句,我已经登录了,所以我不明白为什么我必须重新验证?
  • 在我添加第二个 if 语句以检查字段是否为空之前它工作正常,因此应用程序不会崩溃
  • 请阅读正确的详细信息,为什么需要重新进行身份验证,并请说明您的应用崩溃的情况?
  • 请正确发布活动代码并发布崩溃日志
  • 崩溃日志太长了,写在这里我用它来编辑我的问题
【解决方案2】:

某些安全敏感操作(例如删除帐户、设置主电子邮件地址和更改密码)要求用户最近登录。如果您执行这些操作之一,而用户登录时间过长以前,该操作因错误而失败。发生这种情况时,通过从用户那里获取新的登录凭据并将凭据传递给 reauthenticateWithCredential 来重新对用户进行身份验证。

var user = firebase.auth().currentUser;
var credential;

// Prompt the user to re-provide their sign-in credentials

user.reauthenticateWithCredential(credential).then(function() {
  // User re-authenticated.
}).catch(function(error) {
  // An error happened.
});

【讨论】:

  • 请以android格式提供,请勿复制粘贴其他答案,只需提供答案链接
猜你喜欢
  • 2017-10-29
  • 2013-12-09
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多