簡體   English   中英

用Firebase改密碼為Android

[英]Change password with Firebase for Android

我想為我的應用程序實現更改密碼功能。

我將com.google.firebase:firebase-auth:9.0.2包含在我的build.gradle文件中,到目前為止一切正常,直到我嘗試實現更改密碼功能。

我發現FirebaseUser object 有一個以新密碼作為參數的updatePassword方法。 我可以使用這種方法並自己實施驗證。 但是,我需要用戶的當前密碼來與輸入的密碼進行比較,但我找不到獲取該密碼的方法。

我還在Firebase object 上找到了另一種方法,它采用舊密碼、新密碼和處理程序。 問題是我還需要包括com.firebase:firebase-client-android:2.5.2+來訪問這個 class 並且當我嘗試這種方法時我遇到了以下錯誤:

在 console.firebase.google.com 創建的項目必須使用新的 Firebase 身份驗證 SDK,可從 firebase.google.com/docs/auth/

感覺我在這里遺漏了什么。 推薦的實施方法是什么? 什么時候使用什么依賴?

我在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")
                }
            }
        });

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

無法從 Firebase 身份驗證中檢索用戶的當前密碼。

允許您的用戶更改其密碼的一種方法是顯示一個對話框,讓他們在其中輸入他們當前的密碼和他們想要的新密碼。 然后您使用當前密碼登錄(或重新驗證)用戶並調用updatePassword()來更新它。

我在谷歌上搜索了一些關於重置 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.
  }
});

我在上面鏈接的那個頁面(“另一個頁面”)最終將我帶到了 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.
});

查詢圍繞用戶忘記密碼或希望通過電子郵件重置密碼。 可以通過Auth.sendPasswordResetEmail("email@gmail.com");獲得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) {
            }
        }
    };

在其他地方,當用戶請求更新或重置密碼時,只需訪問 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 會為您處理。

電子郵件是否經過身份驗證? 它在您的身份驗證列表中是否處於活動狀態? 然后發送密碼重置電子郵件。

在此處輸入圖片說明

內容看起來像這樣

在此處輸入圖片說明

重置鏈接將在新網頁上提示以下對話框io

額外的

如果您對 Firebase“設計”的重置模板感到有些緊張。 您可以從 Firebase 控制台輕松訪問和自定義您自己的信函。 身份驗證 > 電子郵件模板 > 密碼重置

在此處輸入圖片說明

處理更改密碼的一種簡單方法是向用戶發送密碼重置電子郵件。

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

這是一個 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")
            }

        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM