2016-06-03 2 views
8

... если вы не позволяете несколько учетных записей с одинаковым адресом адресом, пользователь не может создать новую учетную запись, что знаки в аккаунте Google с адрес электронной почты [email protected], если уже есть учетная запись, которая подписывается с использованием адреса электронной почты [email protected] и пароля .FirebaseAuthInvalidCredentialsException при использовании «Один счета на адрес электронной почты»

я смог войти в систему с провайдером Google за тот же адрес электронной почты, который уже был зарегистрирован через провайдера электронной почты, так что провайдер Google заменил провайдера электронной почты и последний затем не удается войти в систему с FirebaseAuthInvalidCredentialsException: Пароль недействителен или у пользователя нет пароля..

Шаги для воспроизведения:

Вход с провайдером электронной почты -> Выйти -> Вход через провайдера Google -> Выйти

В основном он не должен позволять заменять одного провайдера другим и бросать FirebaseAuthUserCollision Исключение: адрес электронной почты уже используется другой учетной записью.

код, который я использую для знака/Выход:

public void signUpEmail(String email, String password) { 
    mFirebaseAuth.createUserWithEmailAndPassword(email, password) 
     .addOnCompleteListener(this, task -> { 
      if (!task.isSuccessful()) { 
      Log.e("signUpWithEmail", task.getException()); 
      } 
     }); 
    } 

    private void firebaseAuthWithGoogle(GoogleSignInAccount acct) { 
    AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null); 
    mFirebaseAuth.signInWithCredential(credential) 
     .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
      @Override public void onComplete(@NonNull Task<AuthResult> task) { 
      if (!task.isSuccessful()) { 
      Log.e("signInWithCredential", task.getException()); 
      } 
     } 
    }); 
    } 

    public void signInEmail(String email, String password) { 
    mFirebaseAuth.signInWithEmailAndPassword(email, password) 
     .addOnCompleteListener(this, task -> { 
      if (!task.isSuccessful()) { 
      Log.e("signInWithEmail", task.getException()); 
      } 
     }); 
    } 

    public void signOut() { 
    Auth.GoogleSignInApi.signOut(mGoogleApiClient); 
    mFirebaseAuth.signOut(); 
    startSignInActivity(); 
    } 

Спасибо!

+1

Многое могло бы зависеть от кода здесь. Что-нибудь минимальное, но полное, что вы можете поделиться? –

+0

Добавлен код и несколько пояснений. –

ответ

2

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

Воссоздать:

  1. Вход с использованием электронной почты Google х @ х
  2. Войти через facebook электронной почты х @ х
  3. Создание электронной почты пароль учетной записи х @ х

Теперь вы Вы получите 3 разных пользователя.

Если вы используете строго рекомендуемые отдельные учетные записи для каждого электронного письма, 3 провайдера выше будут находиться в пределах одного пользователя (один uid).

Когда вы впервые создаете учетную запись google x @ x и пытаетесь войти в систему с помощью новой учетной записи facebook с адресом электронной почты x @ x, вы получите сообщение об ошибке, которое требуется для продолжения связи. Затем вам нужно будет войти в первый пользователь Google и связать с ним нового пользователя facebook.

+0

Спасибо, дело в том, что я получал исключение FirebaseAuthInvalidCredentialsException вместо связывания требуемой ошибки, поэтому было неясно, что не так –

+0

Понятно, я понимаю ваш вопрос сейчас. Я думаю, что в одном аккаунте по электронной почте это может быть предназначено. Как правило, связь будет срабатывать при входе с тем же адресом электронной почты с использованием другого провайдера. Однако это особый случай. Поскольку электронные письма Google проверены, а поставщики почтовых паролей в этом случае - нет, вы входите напрямую, не связываясь со своей учетной записью электронной почты. Однако я проверю, является ли удаляемый поставщик пароля также частью этого предполагаемого поведения. – bojeil

3

Для оптимизации пользовательских параметров пользовательского интерфейса и повышения безопасности учетной записи Firebase Authentication имеет концепцию «надежного поставщика», где поставщик удостоверений также является поставщиком услуг электронной почты. Например, Google является доверенным провайдером для адресов @ gmail.com, Yahoo является доверенным провайдером для адресов @ yahoo.com и адресов Microsoft для @ outlook.com.

В режиме «Одна учетная запись в электронном адресе» Firebase Authentication пытается связать учетную запись на основе адреса электронной почты. Если пользователь вошел в систему из доверенного провайдера, пользователь сразу же вступает в учетную запись, так как мы знаем, что пользователь владеет адресом электронной почты.

Если существует существующая учетная запись с тем же адресом электронной почты, но с другими учетными данными (например, с паролем или ненадежным поставщиком), предыдущие учетные данные удаляются из соображений безопасности.

Фишер (который не является владельцем адреса электронной почты) может создать начальную учетную запись - удаление первоначальных учетных данных не позволит фишеру получить доступ к учетной записи впоследствии. Законный пользователь может настроить пароль, пройдя поток сброса пароля, где ей нужно будет доказать, что она владеет адресом электронной почты.

+0

Я считаю, что это объясняет, почему Google Sign In перезаписывает учетные данные поставщика адресов электронной почты. –

Смежные вопросы