Как узнать, зарегистрировано ли электронное письмо в Firebase Simple Login? - программирование
Подтвердить что ты не робот

Как узнать, зарегистрировано ли электронное письмо в Firebase Simple Login?

Я использую firebase (с Angularfire) для приложения html5 phone. Пользователь вводит только свой адрес электронной почты на начальном экране, а затем, в зависимости от того, зарегистрировано ли это электронное письмо или нет, пользователь перенаправляется на страницу входа или регистрации соответственно. Для шага 1, как мы можем запросить простой логин firebase, чтобы определить, зарегистрировано ли электронное письмо?

4b9b3361

Ответ 1

Обновление 6/26/2016

Многое изменилось с тех пор, как это было изначально опубликовано, Firebase Authentication больше не называется Firebase Simple Login.

Кроме того, похоже, что доступен новый метод fetchProvidersForEmail, который может обеспечить решение этой проблемы.

Из docs:

fetchProvidersForEmail (email) возвращает firebase.Promise, содержащий ненулевой массив строки

Получает список идентификаторов провайдера, которые могут использоваться для входа для данного адреса электронной почты. Полезно для потока входа "идентификатор-первый".

Я не тестировал это, но я бы предположил, что если вы вызовете этот метод и получите массив поставщиков, тогда электронное письмо уже должно быть зарегистрировано у одного или нескольких поставщиков проверки подлинности.

Старый ответ

Я не верю, что вы можете запросить Firebase Simple Login напрямую для этой информации, не пытаясь фактически войти в систему или зарегистрировать их.

Что вам нужно сделать, это сохранить список зарегистрированных электронных писем во время процесса регистрации и вместо этого запросить этот список. Затем вы можете запросить этот путь, и если он вернется с данными, он существует, в противном случае это не так.

Ответ 2

Ну, после #Kato и #MikePugh прокомментировал предложения, я напишу это решение, и это сработало для меня.

Solutio # 1 (рекомендуется)

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

Решение # 2

Создайте фиктивный объект FirebaseUser.

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

Позже, когда пользователь вводит пароль и нажимает кнопку SIGNUP, вы можете просто обновить пароль пользователя, который был установлен как 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.");
                        }
                    }
                });

Вы можете видеть, что я использовал переменную isSingUpMade, чтобы гарантировать, что пользователь нажимает кнопку SINGUP.

Если пользователь хочет выйти без регистрации, этот фиктивный пользователь должен быть удален с сервера FIREBASE.

так вот логика.

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

Ответ 3

Вы можете добавить следующие коды перед методом register() _ в свою регистрационную активность.

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if(email.equals(user.getEmail().trim())) {
    Toast.makeText(this, "Email is taken", Toast.LENGTH_SHORT).show();
    return;
}

Ответ 4

Немного проще понять, как поймать, если пользователь уже существует при регистрации с помощью электронной почты/пароля

  • Поймать ошибку.
  • Если существует "auth/email-already-in-use"
  • Вызов другой функции, содержащей .signInWithEmailAndPassword()

Пример

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

Важная часть, которую вы хотите использовать в своем собственном коде, будет

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