2016-06-03 8 views
8

... "이메일 주소 당 하나 개의 계정이"당신이 동일한 이메일 주소로 여러 계정을 허용하지 않는 경우에 사용하여, 사용자는 새 계정을 만들 수 없습니다 그와 Google 계정을 사용 표지판 이미 주소가 인 이메일 주소 [email protected]은 이메일 주소 [email protected] 및 비밀번호를 사용하여 로그인하는 계정입니다. 구글 공급자가 이메일 제공 업체를 교체하고, 후자는 다음 FirebaseAuthInvalidCredentialsException로 로그인하지 않도록 FirebaseAuthInvalidCredentialsException

나는 이미 이메일 제공 업체를 통해 등록 된 동일한 이메일에 대한 구글 공급자에 로그인 할 수 있었다 : 암호가 잘못 또는이다 사용자에게는 암호가 없습니다.
.

단계 재현 :

로그인을 이메일 제공 업체에 -> 로그 아웃을 -> 구글의 제공으로 로그인 ->

을 기본적으로 로그 아웃 1 개의 프로 바이더를 다른 프로 바이더와 옮겨 놓는 것을 허가하지 말아주세요. 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. 로그인 구글 이메일 X @ X
  2. 기호에 페이스 북 이메일로 X @ X
  3. 만들기 이메일 암호 계정 이제 X @ X

당신이 3 명의 다른 사용자가 있습니다.

이메일 당 강력하게 권장되는 단일 계정을 사용하는 경우 위의 3 개 제공 업체는 동일한 사용자 (하나의 uid) 내에 있습니다.

처음 x @ x Google 계정을 만들고 x @ x 이메일로 새 Facebook 계정으로 로그인하려고하면 연결을 계속해야한다는 오류가 발생합니다. 그런 다음 첫 번째 Google 사용자에 로그인하고 새 Facebook 사용자를 링크해야합니다.

+0

감사합니다. 문제는 무엇이 잘못되었는지 명확하지 않아 필요한 오류를 연결하는 대신 FirebaseAuthInvalidCredentialsException을 얻었습니다. –

+0

알겠습니다. 지금 질문을 이해합니다. 전자 메일 당 하나의 계정에서 생각할 수 있습니다. 일반적으로 다른 공급자를 사용하여 동일한 이메일로 로그인 할 때 연결이 트리거됩니다. 그러나 이것은 특별한 경우입니다. 이 경우 Google 이메일이 확인되고 이메일 비밀번호 제공자가 아니기 때문에 이메일 계정에 연결하지 않고 직접 로그인하게됩니다. 그러나 삭제할 암호 공급자도이 의도 된 동작의 일부인지 확인합니다. – bojeil

3

로그인 UI 단계를 최적화하고 계정 보안을 강화하기 위해 Firebase 인증에는 '신뢰할 수있는 공급자'라는 개념이 있습니다. 여기에는 ID 공급자가 전자 메일 서비스 공급자이기도합니다. 예를 들어, Google은 @ gmail.com 주소에 대해 신뢰할 수있는 공급자이고, Yahoo는 @ yahoo.com 주소에 대해 신뢰할 수있는 공급자이며, Microsoft는 @ Outlook.com 주소에 대해 신뢰할 수있는 공급자입니다.

"이메일 계정 당 하나의 계정"모드에서 Firebase 인증은 이메일 주소를 기반으로 계정을 연결하려고 시도합니다. 사용자가 신뢰할 수있는 제공 업체로부터 로그인하면 사용자가 이메일 주소를 소유하고 있다는 것을 알고 있으므로 사용자는 즉시 계정에 로그인합니다.

이메일 주소가 동일하지만 다른 자격증 명 (예 : 비밀번호 또는 신뢰할 수없는 제공 업체)으로 만든 기존 계정이있는 경우 보안상의 이유로 이전 자격 증명이 삭제됩니다.

전자 메일 주소 소유자가 아닌 피셔 (phisher)가 초기 계정을 만들 수 있습니다. 초기 자격 증명을 제거하면 나중에 피싱 사가 계정에 액세스하지 못할 수 있습니다. 합법적 인 사용자는 암호 재설정 흐름을 통해 암호를 설정할 수 있습니다. 여기서 암호 재설정 흐름을 통해 자신이 전자 메일 주소를 소유하고 있음을 증명해야합니다.

+0

Google 로그인이 이메일 주소 제공 업체 자격증 명을 덮어 쓰는 이유에 대한 설명입니다. –