アプリケーションにパスワード変更機能を実装したい。
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を使用する必要があります
ここに何か足りないように感じます。これを実装するための推奨されるアプローチは何ですか?そして、どの依存関係をいつ使用するか?
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")
}
}
});
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();
}
}
});
}
}
Firebase Authenticationからユーザーの現在のパスワードを取得する方法はありません。
ユーザーがパスワードを変更できるようにする1つの方法は、現在のパスワードと希望する新しいパスワードを入力するダイアログを表示することです。次に、 サインイン (または 再認証 )現在のパスワードでユーザーを呼び出し、 updatePassword()
を呼び出して更新します。
クエリは、ユーザーがパスワードを忘れたり、電子メールでパスワードをリセットしたいことを中心に展開します。 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がそれを処理します。
電子メールは認証されていますか?認証リストでアクティブになっていますか?次に、パスワードリセットメールを送信します。
コンテンツは次のようになります
リセットリンクは、新しいWebページで次のダイアログを表示します
追加
firebaseによって「考案された」リセットテンプレートに少し神経質になっている場合。 Firebase Consoleから独自のレターに簡単にアクセスしてカスタマイズできます。認証>メールテンプレート>パスワードのリセット