html5 - tutorial - ¿Cómo saber si un correo electrónico ya está registrado con Firebase Simple Login?
tutorial firebase auth (4)
Estoy usando firebase (con Angularfire) para una aplicación de teléfono html5. El usuario solo ingresa su correo electrónico en la pantalla de inicio, y luego, dependiendo de si ese correo electrónico ya está registrado o no, el usuario es redirigido a la página de inicio de sesión o registro, respectivamente. Para el paso 1, ¿cómo podemos consultar el inicio de sesión simple de Firebase para determinar si el correo electrónico está registrado o no?
Actualización 26/06/2016
Mucho ha cambiado desde que se publicó originalmente, Firebase Authentication ya no se llama Firebase Simple Login.
Además, parece que hay un nuevo método disponible fetchProvidersForEmail
que podría proporcionar una solución a este problema.
De los documentos :
fetchProvidersForEmail (email) devuelve firebase.Promise que contiene una matriz no nula de cadena
Obtiene la lista de ID de proveedor que se puede usar para iniciar sesión en la dirección de correo electrónico especificada. Útil para un flujo de inicio de sesión de "identificador primero".
No he probado esto, pero me imagino que si llama a ese método y recibe una variedad de proveedores, entonces el correo electrónico ya debe estar registrado con uno o más proveedores de autenticación.
Vieja respuesta
No creo que pueda consultar el inicio de sesión simple de Firebase directamente para obtener esa información sin intentar iniciar sesión en el usuario o registrarlos.
Lo que tendría que hacer es almacenar una lista de correos electrónicos registrados durante su proceso de registro y consultar esa lista en su lugar. Entonces puede consultar esa ruta y si vuelve con datos, existe, de lo contrario no lo hace.
Puede agregar los siguientes códigos antes del método register () _ en su registerActivity.
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if(email.equals(user.getEmail().trim())) {
Toast.makeText(this, "Email is taken", Toast.LENGTH_SHORT).show();
return;
}
Bueno, siguiendo las sugerencias comentadas de # Kato y # MikePugh, voy a escribir esta solución y funcionó para mí.
Solutio # 1 (altamente recomendado)
mAuth.fetchProvidersForEmail("[email protected]").addOnCompleteListener(new OnCompleteListener<ProviderQueryResult>() {
@Override
public void onComplete(@NonNull Task<ProviderQueryResult> task) {
if(task.isSuccessful()){
///////// getProviders().size() will return size 1. if email ID is available.
task.getResult().getProviders().size();
}
}
});
Solución n. ° 2
Crea un objeto FirebaseUser ficticio.
FirebaseUser firebaseUser = null;
private FirebaseAuth mAuth;
private void isEmailAlreadyUsed() {
mAuth = FirebaseAuth.getInstance();
///// here I am gonna create dummy user at **Firebase** with the Entered email Id (Email to check against)
mAuth.createUserWithEmailAndPassword(mEmailView.getText().toString(), "dummypass")
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
Log.d(TAG, "createUser:onComplete:" + task.isSuccessful());
if (task.isSuccessful()) {
/////user do not exit so good to initialize firebase user.
firebaseUser = task.getResult().getUser();
} else {
if(task.getException().getMessage().equals("The email address is already in use by another account.")) {
Log.d(TAG, "This email ID already used by someone else");
}
}
}
});
}
Más adelante, cuando el usuario ingrese la contraseña y presione el botón SIGNUP , podrá actualizar la contraseña del usuario que se configuró como dummypass .
boolean isSignUpMade = false;
if (firebaseUser != null)
firebaseUser.updatePassword(password)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
signUpCallProgress.setVisibility(View.VISIBLE);
if (task.isSuccessful()) {
isSignUpMade = true;
Log.d(TAG, "User password updated.");
} else {
isSignUpMade = false;
Log.d(TAG, "User password not updated.");
}
}
});
Puedes ver que he usado la variable IsSupUpMade solo para asegurar que el usuario presiona el botón SINGUP .
Si el usuario quiere irse sin registrarse, ese usuario ficticio debe ser eliminado del servidor FIREBASE .
así que aquí está la lógica.
@Override
public void onBackPressed() {
if (!isSignUpMade) {
if (firebaseUser != null)
firebaseUser.delete().addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
Log.d(TAG, "User account deleted.");
}
}
});
}
super.onBackPressed();
}
Un ejemplo un poco más fácil de entender cómo atrapar si el usuario ya existe al registrarse con el correo electrónico / contraseña
- Capte el error
- Si existe "auth / email-already-in-use"
- Llamar a otra función que contenga
.signInWithEmailAndPassword()
Ejemplo
.createUserWithEmailAndPassword(email, password)
.catch(error => {
// Handle Errors here.
const errorCode = error.code;
const errorMessage = error.message;
// Catch this errorCode to know if user exists
if (errorCode === ''auth/email-already-in-use'') {
// Call function X to sign user in instead
signInMail(email, password);
return;
}
// Weak password?
else if (errorCode == ''auth/weak-password'') {
console.log(''The password is too weak.'');
}
else {
console.log(errorMessage);
}
console.log(error);
})
La parte importante que desea usar en su propio código sería esta
.catch(error => {
// Handle Errors here.
const errorCode = error.code;
const errorMessage = error.message;
if (errorCode === ''auth/email-already-in-use'') {
console.log(''This email is already in use'');
// Your action
return;
}
})