使用Firebase for Android更改密码

时间:2016-10-05 05:32:42

标签: android firebase firebase-authentication

我想为我的应用程序实现更改密码功能。

我在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

感觉我在这里错过了一些东西。实施此建议的方法是什么?什么时候使用什么依赖?

6 个答案:

答案 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会为您处理。

电子邮件是否已通过身份验证?它在验证列表中是否处于活动状态?然后发送密码重置电子邮件。

enter image description here

内容看起来像这样

enter image description here

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

<强>附加

如果您对重置模板感到有点紧张&#34;设计&#34;通过Firebase。您可以从Firebase控制台轻松访问和自定义您自己的信件。 身份验证&gt;电子邮件模板&gt;密码重置

enter image description here

答案 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();
            }
    });