我想为我的应用程序实现更改密码功能。
我在com.google.firebase:firebase-auth:9.0.2
文件中添加了build.gradle
,到目前为止,在我尝试实施更改密码功能之前,所有内容都运行正常。
我发现FirebaseUser
对象有一个updatePassword
方法,它接受一个新密码作为参数。我可以使用这种方法并自己实现验证。但是,我需要用户当前的密码与输入的密码进行比较,我找不到获取密码的方法。
我还在Firebase
对象上找到了另一个method,它带有旧密码,新密码和处理程序。问题是我还需要包含com.firebase:firebase-client-android:2.5.2+
来访问这个类,当我尝试这个方法时,我会遇到以下错误:
在console.firebase.google.com上创建的项目必须使用firebase.google.com/docs/auth /
中提供的新Firebase身份验证SDK
感觉我在这里错过了一些东西。实施此建议的方法是什么?什么时候使用什么依赖?
答案 0 :(得分:36)
我在Firebase docs中找到了一个方便的例子:
一些安全敏感操作 - 例如删除帐户,设置帐户 主电子邮件地址和更改密码 - 要求用户 最近已经登录。如果您执行其中一项操作,那么 用户在很久以前登录,操作失败并抛出 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")
}
}
});
答案 1 :(得分:15)
在firebase中更改密码有点棘手。它不像我们通常用于更改服务器端脚本和数据库中的密码。要在您的应用中实现更改密码功能,首先您需要从FirebaseAuth获取用户的电子邮件或提示用户输入电子邮件,然后提示用户输入旧密码,因为您无法检索用户的密码,如Frank van 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();
}
}
});
}
}
答案 2 :(得分:11)
无法从Firebase身份验证中检索用户的当前密码。
允许用户更改密码的一种方法是显示一个对话框,输入他们当前的密码和他们想要的新密码。然后,您sign in(或re-authenticate)用户使用当前密码并致电updatePassword()
进行更新。
答案 3 :(得分:2)
我用Google搜索了有关重置Firebase密码的内容,然后转到了此页面。这很有帮助,但并没有让我一路走到终点:我仍然不得不在Google上待上五到十分钟。因此,我将为VueJS用户改进答案。
我在这里看到许多使用“ FirebaseUser user = FirebaseAuth.getInstance()。getCurrentUser();”的代码。在第一行。这是最受欢迎的两个答案中提到的难题。
但是我无法在用VueJS编写的项目中使用它。所以我不得不去探索。
我发现的是another page的Firebase文档。人们从(我认为)获得引用的代码的页面是同一页面,但是使用的是为Web而不是Android/Java编写的文档。
因此,如果您在这里使用VueJS,请查看第一个链接。我认为这会有所帮助。 “获取当前登录的用户”可能包含适用于您的项目的代码。我在那找到的代码说:
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
// User is signed in.
} else {
// No user is signed in.
}
});
我在上面链接的该页面(“另一个页面”)最终使我进入了Web文档的“ Set a user's password”部分。此处的张贴者正确地指出,用户必须最近已通过身份验证才能启动密码更新。尝试this link以获得有关重新验证用户的更多信息。
“设置用户密码”:
// 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.
});
答案 4 :(得分:1)
查询围绕用户忘记密码或希望通过电子邮件信件重置密码。这可以通过Auth.sendPasswordResetEmail("email@gmail.com");
从初始化开始
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private String DummyEmail = "Dummy@gmail.com"
mAuth = FirebaseAuth.getInstance();
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
if (firebaseAuth.getCurrentUser() == null) {
}
}
};
当用户请求更新或重置密码时,只需访问真相,
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会为您处理。
电子邮件是否已通过身份验证?它在验证列表中是否处于活动状态?然后发送密码重置电子邮件。
内容看起来像这样
<强>附加强>
如果您对重置模板感到有点紧张&#34;设计&#34;通过Firebase。您可以从Firebase控制台轻松访问和自定义您自己的信件。 身份验证&gt;电子邮件模板&gt;密码重置
答案 5 :(得分:0)
处理密码更改的一种简单方法是向用户发送密码重置电子邮件。
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();
}
});