Firebaseユーザー認証方法でユーザーがcreateUserWithEmailAndPassword()
でサインアップしようとしたときに確認したいのですが、このユーザーは既にアプリに登録されています。
その電子メールアドレスを持つユーザーが既に存在するかどうかを検出するために、createUserWithEmailAndPassword ()
の呼び出しが_auth/email-already-in-use
_で失敗したことを検出できます。 @Srinivasanがこれに対する答えを投稿したことがわかります。
または、 fetchSignInMethodsForEmail()
(以前の呼び出し fetchProvidersForEmail()
)を呼び出すことで、メールアドレスがすでに使用されていることを検出できます。
ユーザーが同じ電子メールアドレスを持つユーザーを作成しようとすると、タスクの応答は "応答:電子メールアドレスは既に別のアカウントで使用されています。"
mFirebaseAuth.createUserWithEmailAndPassword(email,password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(task.isSuccessful()){
//User registered successfully
}else{
Log.i("Response","Failed to create user:"+task.getException().getMessage());
}
}
});
まず、Firebaseコンソールでその制限が有効になっていることを確認する必要があります(アカウントとメールアドレスの設定)。 @Srinivasanの答えを見てください。
次に、Javaコードでこれを行います。
firebaseAuthenticator.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (!task.isSuccessful()) {
if (task.getException() instanceof FirebaseAuthUserCollisionException) {
Toast.makeText(SignUpActivity.this, "User with this email already exist.", Toast.LENGTH_SHORT).show();
}
} else {
sendVerificationEmail();
startActivity(new Intent(SignUpActivity.this, DetailsCaptureActivity.class));
}
// ...
}
});
これがトリックの起こる場所です:
if (task.getException() instanceof FirebaseAuthUserCollisionException) {
Toast.makeText(SignUpActivity.this,
"User with this email already exist.", Toast.LENGTH_SHORT).show();
ユーザーを電子メールとパスワードで登録するときにいくつかの例外がスローされる可能性がありますが、関心のあるものはFirebaseAuthUserCollisionException
です。名前が示すように、電子メールが既に存在する場合、この例外がスローされます。スローされた例外がこのクラスのインスタンスである場合、ユーザーに知らせてください。
ここでの@Frankの答えの練習として、fetchProvidersForEmail()
を使用するコードがあります
private boolean checkAccountEmailExistInFirebase(String email) {
FirebaseAuth mAuth = FirebaseAuth.getInstance();
final boolean[] b = new boolean[1];
mAuth.fetchProvidersForEmail(email).addOnCompleteListener(new OnCompleteListener<ProviderQueryResult>() {
@Override
public void onComplete(@NonNull Task<ProviderQueryResult> task) {
b[0] = !task.getResult().getProviders().isEmpty();
}
});
return b[0];
}
ユーザーが存在するかどうかを検出し、登録とログインを実行できるこのような状況を調査していました。 fetchProvidersForEmail
が現在最適なオプションです。私はthisチュートリアルを見つけました。それがあなたにも役立つことを願っています!
参照: ユーザーの管理
UserRecord userRecord = FirebaseAuth.getInstance().getUserByEmail(email);
System.out.println("Successfully fetched user data: " + userRecord.getEmail());
このメソッドは、提供された電子メールに対応するユーザーのUserRecordオブジェクトを返します。
提供された電子メールが既存のユーザーのものではない場合、または他の理由でユーザーを取得できない場合、Admin SDKはエラーをスローします。説明と解決手順を含むエラーコードの完全なリストについては、 Admin Authentication API Errors を参照してください。
以下のコードをMainActivity.Javaファイルに追加します。ユーザーが同じメールアドレスで登録しようとすると、「メールアドレスは既に別のアカウントで使用されています」というメッセージが表示されますToastとしてポップアップします
mAuth.createUserWithEmailAndPassword(email,password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(!task.isSuccessful()){
Toast.makeText(MainActivity.this, task.getException().getMessage(), Toast.LENGTH_SHORT).show();
}
if(task.isSuccessful()){
Toast.makeText(MainActivity.this, "Sign up successfull", Toast.LENGTH_SHORT).show();
}
}
});
private ProgressDialog progressDialog;
progressDialog.setMessage("Registering, please Wait...");
progressDialog.show();
mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
//checking if success
if (task.isSuccessful()) {
//Registration was successfull:
Toast.makeText(RegistrationActivity.this, "Successfully registered!", Toast.LENGTH_LONG).show();
} else {
//Registration failed:
//task.getException().getMessage() makes the magic
Toast.makeText(RegistrationActivity.this, "Registration failed! " + "\n" + task.getException().getMessage(), Toast.LENGTH_LONG).show();
}
progressDialog.dismiss();
}
});