web-dev-qa-db-ja.com

AndroidのFirebaseでパスワードを変更する

アプリケーションにパスワード変更機能を実装したい。

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 Authentication SDKを使用する必要があります

ここに何か足りないように感じます。これを実装するための推奨されるアプローチは何ですか?そして、どの依存関係をいつ使用するか?

21
nilsi

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("[email protected]", "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")
                }
            }
        });
39
nilsi

Firebaseでパスワードを変更するのは少し難しいです。サーバー側のスクリプトとデータベースでパスワードを変更するために通常行うこととは異なります。アプリにパスワード変更機能を実装するには、まず、Frank van Puffelenが言ったように、ユーザーのパスワードを取得できないため、ユーザーのメールをFirebaseAuthから取得するか、ユーザーにメールを入力するように要求し、その後ユーザーに古いパスワードを入力するように要求する必要があります。その後、それを再認証する必要があります。再認証が完了したら、成功したら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();
                        }
                    }
                });
            }
        }
16

Firebase Authenticationからユーザーの現在のパスワードを取得する方法はありません。

ユーザーがパスワードを変更できるようにする1つの方法は、現在のパスワードと希望する新しいパスワードを入力するダイアログを表示することです。次に、 サインイン (または 再認証 )現在のパスワードでユーザーを呼び出し、 updatePassword() を呼び出して更新します。

12

クエリは、ユーザーがパスワードを忘れたり、電子メールでパスワードをリセットしたいことを中心に展開します。 Auth.sendPasswordResetEmail("[email protected]");で達成できます

初期化することから始めます

    private FirebaseAuth mAuth;
    private FirebaseAuth.AuthStateListener mAuthListener;
    private String DummyEmail = "[email protected]"

    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がそれを処理します。

電子メールは認証されていますか?認証リストでアクティブになっていますか?次に、パスワードリセットメールを送信します。

enter image description here

コンテンツは次のようになります

enter image description here

リセットリンクは、新しいWebページで次のダイアログを表示します io

追加

firebaseによって「考案された」リセットテンプレートに少し神経質になっている場合。 Firebase Consoleから独自のレ​​ターに簡単にアクセスしてカスタマイズできます。認証>メールテンプレート>パスワードのリセット

enter image description here

1
Alexandros