使用Firebase for Android更改密码

nil*_*lsi 23 android firebase firebase-authentication

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

我包含com.google.firebase:firebase-auth:9.0.2在我的build.gradle文件中,到目前为止,一切都工作正常,直到我尝试实现更改密码功能.

我发现该FirebaseUser对象有一个updatePassword方法,它接受一个新密码作为参数.我可以使用这种方法并自己实现验证.但是,我需要用户的当前密码与输入的密码进行比较,我找不到获取密码的方法.

我还在对象上找到了另一种方法,Firebase它接受旧密码,新密码和处理程序.问题是我还需要包括com.firebase:firebase-client-android:2.5.2+访问这个类,当我尝试这个方法时,我得到以下错误:

在console.firebase.google.com上创建的项目必须使用firebase.google.com/docs/auth/中提供的新Firebase身份验证SDK

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

nil*_*lsi 41

我在Firebase文档中找到了一个方便的示例:

某些安全敏感操作(例如删除帐户,设置主电子邮件地址和更改密码)要求用户最近登录.如果您执行其中一项操作,并且用户已在很久以前登录,则操作失败并抛出FirebaseAuthRecentLoginRequiredException.发生这种情况时,通过从用户获取新的登录凭据并将凭据传递给reauthenticate来重新验证用户身份.例如:

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")
                }
            }
        });
Run Code Online (Sandbox Code Playgroud)


Jul*_*kar 17

在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();
                        }
                    }
                });
            }
        }
Run Code Online (Sandbox Code Playgroud)


Fra*_*len 13

无法从Firebase身份验证中检索用户的当前密码.

允许用户更改密码的一种方法是显示一个对话框,输入他们当前的密码和他们想要的新密码.然后,您使用当前密码登录 (或重新验证)用户并调用updatePassword()以更新它.


Rol*_*oly 5

我在谷歌上搜索了一些关于重置 Firebase 密码的内容,并进入了这个页面。这很有帮助,但并没有让我一路走到终点:我仍然需要谷歌五到十分钟。所以我回来改进 VueJS 用户的答案。

我在这里看到很多代码使用“FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();” 在顶线。这是最受欢迎的两个答案中提到的一个难题。

但是我无法在我的项目中使用它,该项目是用 VueJS 编写的。所以我不得不去探索。

我发现的是Firebase 文档的另一页。这是人们从(我认为)获取引用代码的同一页面,但是文档是为 Web 而不是Android/Java编写的。

因此,如果您在这里使用 VueJS,请查看第一个链接。我认为它会有所帮助。“获取当前登录的用户”可能包含适合您项目的代码。我在那里找到的代码说:

firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    // User is signed in.
  } else {
    // No user is signed in.
  }
});
Run Code Online (Sandbox Code Playgroud)

我在上面链接的那个页面(“另一个页面”)最终将我带到了 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.
});
Run Code Online (Sandbox Code Playgroud)

“重新验证用户”

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.
});
Run Code Online (Sandbox Code Playgroud)

  • 这对于使用 VueJS 的人来说可能非常有帮助,但它并不能真正回答问题,因为问题是关于 Android 的。您能将答案翻译为适用于 Android 吗?您还可以针对 VueJS 提出新问题,并将此答案发布到此处以帮助在 VueJS 中遇到相同问题的人。 (2认同)