Работа с уже используемым адресом электронной почты - Firebase Authentication

В мое приложение встроена аутентификация gmail и facebook через Firebase. Я заметил, что если кто-то подписывается с помощью своего Gmail, а затем регистрируется с Facebook, если Facebook имеет тот же адрес электронной почты, что и Gmail, он получит ошибку:

"Адрес электронной почты уже используется другой учетной записью".

Является ли единственный разумный способ справиться с этим, чтобы пользователь мог войти с другими учетными данными? Может показывать сообщение типа "Электронная почта уже используется, пожалуйста, зарегистрируйтесь с другой учетной записью"?

4 ответа

Решение

Есть 3 способа решения этой проблемы.

Первый - проверить, существует ли адрес электронной почты, а затем отобразить сообщение. Это именно то, что вы сказали. Сообщение зависит от вас.

Второй подход - дать пользователям возможность иметь несколько учетных записей на один адрес электронной почты. Другими словами, если пользователь подписывается с помощью Gmail, а затем подписывается с помощью Facebook, и у него тот же адрес электронной почты, то он в конечном итоге имеет 2 разных аккаунта. Один адрес электронной почты, 2 разных аккаунта. Это не очень хорошая практика, но в соответствии с вашими потребностями вы даже можете использовать ее.

Третий подход - иметь только один аккаунт на один адрес электронной почты. Это означает, что вы запрещаете пользователям создавать несколько учетных записей, используя один и тот же адрес электронной почты с разными поставщиками аутентификации. Это обычная практика, а также правило по умолчанию в консоли Firebase. Это означает, что вы захотите позже внедрить другой вид аутентификации с другим провайдером, он будет следовать тому же правилу. В этом случае будет один адрес электронной почты с одной учетной записью.

Чтобы включить или отключить эту опцию, перейдите в консоль Firebase, выберите Authenticationвыберите SIGN-IN METHOD вкладку и в нижней части вашей страницы вы найдете Advanced раздел.

Надеюсь, поможет.

Это случилось со мной, потому что я неправильно назвал метод. используйте signInWithEmailAndPassword

Поскольку в этой теме много похожих вопросов, я публикую свой метод для этой ошибки, так как я не нашел ответа, подходящего для конкретной ситуации.

Допустим, вы включили вход по электронной почте, а также в Facebook, и пользователь сначала регистрируется с помощью входа по электронной почте, а затем пытается войти в систему с помощью Facebook с тем же адресом электронной почты. Теперь, если вы не хотите связывать эту учетную запись с существующей или не хотите включать несколько учетных записей с одним адресом электронной почты, вы можете просто добавить всплывающее сообщение, которое будет уведомлять пользователя о том, что электронная почта уже используется. И тогда он не сможет войти через Facebook. Вот мой подход, который обрабатывает ошибку, когда пользователь пытается зарегистрироваться через Facebook с уже существующим адресом электронной почты:

       private void handleFacebookAccessToken(AccessToken token) {
        Log.d(TAG, "handleFacebookAccessToken:" + token);

        AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()){

                                // Sign in success, update UI with the signed-in user's information
                                Log.d(TAG, "signInWithCredential:success");
                                FirebaseUser user = mAuth.getCurrentUser();
                                getTokenId();
                                updateUI(user);

                        } else {
                            Toast.makeText(SignInActivity.this, "Your Facebook email is already in use.", Toast.LENGTH_LONG).show();
                        }
                    }
                });
    }

Я в основном использовал код, предоставленный Firebase, и добавил оператор if-else (if (task.isSuccessful())

Надеюсь, это кому-то поможет!

        void createuser(String email, String password) async {
try{
  await FirebaseAuth.instance
    .createUserWithEmailAndPassword(email: email, password: password);
}
on FirebaseAuthException catch (e){
  if(e.code == "email-already-in-use"){

   Get.showSnackbar(const GetSnackBar(
    margin: EdgeInsets.all(15),
    borderRadius: 8,
    message:
        ('There already exists an account with the given email address.'),
    duration: Duration(seconds: 3),
    backgroundColor: Colors.red,
  ));
 }
}

}

Вот пример ошибки аутентификации firebase «электронная почта уже используется».

Другие вопросы по тегам