使用Firebase for Android更改密码

sczxawaw  于 2022-12-04  发布在  Android
关注(0)|答案(7)|浏览(132)

我想为我的应用程序实现更改密码功能。
我在我的build.gradle文件中包含了com.google.firebase:firebase-auth:9.0.2,到目前为止,一切都工作正常,直到我尝试实现更改密码功能。
我发现FirebaseUser对象中有一个updatePassword方法,该方法以新密码为参数。我可以使用该方法,自己实现验证。但是,我需要用户的当前密码与输入的密码进行比较,我无法找到获取该密码的方法。
我还在Firebase对象上发现了另一个方法,它接受旧密码、新密码和一个句柄。问题是我还需要包含com.firebase:firebase-client-android:2.5.2+来访问该类,当我尝试使用这个方法时,我得到了以下错误:
在www.example.com上创建的项目console.firebase.google.com必须使用www.example.com上提供的新Firebase身份验证SDKfirebase.google.com/docs/auth/
我觉得我在这里遗漏了一些东西。推荐的实现方法是什么?什么时候使用什么依赖关系?

shyt4zoc

shyt4zoc1#

我在Firebase文档中找到了一个方便的例子:
某些安全敏感操作(如删除帐户、设置主电子邮件地址和更改密码)要求用户最近登录过。如果您执行这些操作之一,而用户在很久以前登录过,则操作将失败并引发FirebaseAuthRecentLoginRequiredException。发生这种情况时,通过从用户处获取新的登录凭据并传递凭据以重新进行身份验证,重新对用户进行身份验证。例如:

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

// Get auth credentials from the user for re-authentication. The example below shows
// email and password credentials but there are multiple possible providers,
// such as GoogleAuthProvider or FacebookAuthProvider.
AuthCredential credential = EmailAuthProvider
        .getCredential("user@example.com", "password1234");

// Prompt the user to re-provide their sign-in credentials
user.reauthenticate(credential)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    user.updatePassword(newPass).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")
                }
            }
        });
new9mtju

new9mtju2#

在firebase中更改密码有点棘手。它不像我们通常在服务器端脚本和数据库中更改密码所做的那样。要在您的应用中实现更改密码功能,首先,您需要从FirebaseAuth获取用户的电子邮件或提示用户输入电子邮件,然后提示用户输入旧密码,因为您无法检索用户的密码,如Frank货车Puffelen所述。之后,你需要重新验证。一旦重新验证完成,如果成功,你可以使用updatePassword()。我已经添加了一个样本,我自己的应用程序使用下面。希望,它会帮助你。

private FirebaseUser user;
user = FirebaseAuth.getInstance().getCurrentUser();
                final String email = user.getEmail();
                AuthCredential credential = EmailAuthProvider.getCredential(email,oldpass);

                user.reauthenticate(credential).addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        if(task.isSuccessful()){
                                user.updatePassword(newPass).addOnCompleteListener(new OnCompleteListener<Void>() {
                                    @Override
                                    public void onComplete(@NonNull Task<Void> task) {
                                        if(!task.isSuccessful()){
                                            Snackbar snackbar_fail = Snackbar
                                                    .make(coordinatorLayout, "Something went wrong. Please try again later", Snackbar.LENGTH_LONG);
                                            snackbar_fail.show();
                                        }else {
                                            Snackbar snackbar_su = Snackbar
                                                    .make(coordinatorLayout, "Password Successfully Modified", Snackbar.LENGTH_LONG);
                                            snackbar_su.show();
                                        }
                                    }
                                });
                        }else {
                            Snackbar snackbar_su = Snackbar
                                    .make(coordinatorLayout, "Authentication Failed", Snackbar.LENGTH_LONG);
                            snackbar_su.show();
                        }
                    }
                });
            }
        }
b5buobof

b5buobof3#

无法从Firebase身份验证中检索用户的当前密码。
允许您的用户更改密码的一种方法是显示一个对话框,用户可以在其中输入当前密码和所需的新密码。然后您使用当前密码登录(或重新验证)用户,并调用updatePassword()更新密码。

b4qexyjb

b4qexyjb4#

我在谷歌上搜索了一些关于重置Firebase密码的内容,然后找到了这个页面。它很有帮助,但并没有让我一路走到终点:我还是得在谷歌上搜索五到十分钟,所以我回来为VueJS用户改进答案。
我看到这里有很多代码使用“FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();这是最流行的两个答案中提到的谜题的一部分。
但是我无法在我的项目中使用它,我的项目是用VueJS编写的,所以我不得不去探索。
我找到的是Firebase文档的another page,它和人们得到引用代码的页面是一样的(我想),但是用的是为Web编写的文档,而不是Android/Java
所以,如果你在这里使用VueJS,请查看第一个链接。我认为它会很有帮助。“获取当前登录用户”可能包含适合你的项目的代码。我在那里找到的代码是:

firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    // User is signed in.
  } else {
    // No user is signed in.
  }
});

我在上面链接的那个页面(“另一个页面”)最终把我带到了Web文档的“设置用户密码”部分。这里的海报正确地说明了用户必须在最近通过身份验证才能启动密码更新。尝试这个链接以获得更多关于重新验证用户的信息。
“设置用户密码”:

// You can set a user's password with the updatePassword method. For example:

var user = firebase.auth().currentUser;
var newPassword = getASecureRandomPassword();

user.updatePassword(newPassword).then(function() {
  // Update successful.
}).catch(function(error) {
  // An error happened.
});

“重新验证使用者”

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

woobm2wo5#

查询用户忘记密码或希望通过电子邮件重置密码,可通过Auth.sendPasswordResetEmail("email@gmail.com");实现
通过初始化开始
第一个
在其他地方,当用户请求更新或重置其密码时,只需访问mAuth,

private void PassResetViaEmail(){
    if(mAuth != null) {
        Log.w(" if Email authenticated", "Recovery Email has been  sent to " + DummyEmail);
        mAuth.sendPasswordResetEmail(DummyEmail);
    } else {
        Log.w(" error ", " bad entry ");
    }
    }

现在,Firebase mAuth将为您处理该问题,您无需在数据库中查询电子邮件是否存在。
电子邮件是否已通过验证?它是否在您的验证列表中处于活动状态?然后发送密码重置电子邮件。

内容如下所示

重置链接将在新网页上提示以下对话框

额外

如果你对Firebase“设计”的重置模板有点紧张,你可以从Firebase控制台轻松访问和定制你自己的信件。

zvokhttg

zvokhttg6#

处理密码更改的一种简单方法是向用户发送密码重置电子邮件。

FirebaseAuth.getInstance().sendPasswordResetEmail("user@example.org")
    .addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
            if (task.isSuccessful()) {
                Toast.makeText(Activity.this, "Password Reset Email Sent!"), Toast.LENGTH_LONG).show();
            }
            else {
                Toast.makeText(Activity.this, task.getException().getLocalizedMessage(), Toast.LENGTH_LONG).show();
            }
    });
njthzxwz

njthzxwz7#

这是一个Kotlin解决方案,我把方法放在这里,希望能有所帮助

// The method takes current users email (currentUserEmail), current users old password (oldUserPassword), new users password (newUserPassword) as parameter and change the user password to newUserPassword
private fun fireBasePasswordChange(
    currentUserEmail: String,
    oldUserPassword: String,
    newUserPassword: String
) {
// To re authenticate the user credentials getting current sign in credentials
    val credential: AuthCredential =
        EmailAuthProvider.getCredential(currentUserEmail, oldUserPassword)

// creating current users instance 
    val user: FirebaseUser? = FirebaseAuth.getInstance().currentUser

// creating after successfully re authenticating update password will be called else it will provide a toast about the error ( makeToast is a user defined function here for providing a toast to the user)
    user?.reauthenticate(credential)?.addOnCompleteListener { task ->
        when {
            task.isSuccessful -> {
                user.updatePassword(newUserPassword).addOnCompleteListener {
                    if (it.isSuccessful) {
                        makeToast("Password updated")
                        
                        // This part is optional
                        // it is signing out the user from the current status once changing password is successful
                        // it is changing the activity and going to the sign in page while clearing the backstack so the user cant come to the current state by back pressing
                        
                        FirebaseAuth.getInstance().signOut()
                        val i = Intent(activity, SignInActivity::class.java)
                        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
                        startActivity(i)
                        (activity as Activity?)!!.overridePendingTransition(0, 0)

                    } else
                        makeToast("Error password not updated")
                }
            }
            else -> {
                makeToast("Incorrect old password")
            }

        }
    }
}

相关问题