FirebaseAuthUserCollisionException?
Estoy utilizando la documentación firebase para usar Facebook inicio de sesión de mi aplicación Android. Soy capaz de acceder a los usuarios con Google y Twitter. Pero cuando hago clic en Iniciar sesión con Facebook, el botón cambia al botón Cerrar sesión. En realidad, debe redirigir a la actividad de éxito de inicio de sesión, porque FirebaseAuth.AuthStateListener
configurado FirebaseAuth.AuthStateListener
.
Estoy publicando la Activity
aquí, por favor, hágamelo saber si estoy haciendo algo mal.
- Firebase Manage Multiple auth provider
- Cómo integrar la autenticación firebase con los puntos finales del motor de aplicaciones de Google
- Robolectric app testing con Firebase
- La autenticación de Firebase de Android no funciona
- Firebase UI - Auth - Utilizar diseño propio
public class MainActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener { private static final String TAG = "MainActivity"; private static final int GOOGLE_RC_SIGN_IN = 9001; private static final int TWITTER_RC_SIGN_IN = 140; private FirebaseAuth mAuth; private FirebaseAuth.AuthStateListener mAuthStateListener; private GoogleApiClient mGoogleApiClient; CallbackManager callbackManager; @BindView(R.id.google_signin_button) SignInButton mGoogleSigninButton; @BindView(R.id.facebook_login_button) LoginButton mFacebookLoginButton; @BindView(R.id.twitter_login_button) TwitterLoginButton mTwitterLoginButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TwitterAuthConfig authConfig = new TwitterAuthConfig(getString(R.string.twitter_consumer_key), getString(R.string.twitter_consumer_secret)); Fabric.with(this, new Twitter(authConfig)); FacebookSdk.sdkInitialize(this); setContentView(R.layout.activity_main); ButterKnife.bind(MainActivity.this); GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken(getString(R.string.default_web_client_id)) .requestEmail() .build(); mGoogleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage(this,this) .addApi(Auth.GOOGLE_SIGN_IN_API,gso) .build(); mAuth = FirebaseAuth.getInstance(); mAuthStateListener = new FirebaseAuth.AuthStateListener(){ @Override public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { FirebaseUser user = firebaseAuth.getCurrentUser(); if (user != null) { //User is signed in Log.v(TAG, "Yo Baby"); Log.d(TAG,"name"+user.getDisplayName()); goToHome(); } else { //Do some logic } } }; mGoogleSigninButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent signinIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); startActivityForResult(signinIntent, GOOGLE_RC_SIGN_IN); } }); callbackManager = CallbackManager.Factory.create(); mFacebookLoginButton.setReadPermissions("email", "public_profile"); mFacebookLoginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { @Override public void onSuccess(LoginResult loginResult) { handleFacebookAuthentication(loginResult.getAccessToken()); } @Override public void onCancel() { } @Override public void onError(FacebookException error) { } }); mTwitterLoginButton.setCallback(new Callback<TwitterSession>() { @Override public void success(Result<TwitterSession> result) { handleTwitterAuthentication(result.data); } @Override public void failure(TwitterException exception) { } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == GOOGLE_RC_SIGN_IN){ GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); if (result.isSuccess()) { GoogleSignInAccount account = result.getSignInAccount(); handleGoogleAuthentication(account); } else { //Google Login Failed } } else if (requestCode == TWITTER_RC_SIGN_IN) { mTwitterLoginButton.onActivityResult(requestCode,resultCode,data); } else { callbackManager.onActivityResult(requestCode,resultCode,data); } } private void handleGoogleAuthentication(GoogleSignInAccount account) { AuthCredential credential = GoogleAuthProvider.getCredential(account.getIdToken(), null); mAuth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { //Save Credentials in Google Smart Lock } else { // } } }); } private void handleFacebookAuthentication(AccessToken accessToken) { AuthCredential credential = FacebookAuthProvider.getCredential(accessToken.getToken()); mAuth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { //Save Credentials in Google Smart Lock } else { } } }); } private void handleTwitterAuthentication(TwitterSession session) { AuthCredential credential = TwitterAuthProvider.getCredential(session.getAuthToken().token, session.getAuthToken().secret); mAuth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { //Save credentials in Google Smart lock } else { } } }); } private void goToHome() { startActivity(new Intent(MainActivity.this, HomeActivity.class)); finish(); return; } @Override protected void onStart() { super.onStart(); mAuth.addAuthStateListener(mAuthStateListener); } @Override protected void onStop() { super.onStop(); if (mAuthStateListener != null) { mAuth.removeAuthStateListener(mAuthStateListener); } } @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { } }
Actualizar1
Finalmente entendí la razón por la que el inicio de sesión de Facebook no funciona. Esto se debe a que ya he iniciado sesión en la aplicación mediante Google Signin. Dado que mi correo electrónico para Google y Facebook son los mismos que está dando FirebaseAuthUserCollisionException
. Debería haber depurado la aplicación antes de publicar la pregunta en Stackoverflow.
Actualización2
No estoy cerrando esta pregunta, ya que puede ayudar a alguien que se enfrentó a la situación como yo. Y también actualizaré la solución para FirebaseAuthUserCollisionException
, a medida que extraigo más información.
- Fallo de autenticación anónima de Firebase a través de datos móviles
- Vaciar el campo de correo electrónico de Firebase Auth Usuario que utiliza Integración de inicio de sesión de Facebook (Firebase 3.0)
- Google Firebase se cierra y se olvida del usuario en la aplicación para Android
- Obtener id token en la aplicación de Android y verificarlo en el servidor de back-end (¿Cómo usar id token?)
- Verificación de correo electrónico con Firebase 3.0 en Android
- FirebaseUI Auth - Error de inicio de sesión de Facebook: respuesta de debug_token fallida de Facebook
- Cómo capturar una Firebase Auth excepciones específicas
- Firebase Auth - con correo electrónico y contraseña - Comprobar usuario ya registrado
Me enfrenté al mismo problema y esto es cómo me dieron alrededor con.
Si la tarea no tiene éxito, estoy comprobando si la excepción lanzada es una instanceof FirebaseAuthUserCollisionException
. En caso afirmativo, se mostrará un brindis al usuario diciendo: 'Cuenta con correo electrónico ya existe!'.
private void handleFacebookAccessToken(final 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()) { Log.w(TAG, "signInWithCredential", task.getException()); Toast.makeText(getApplicationContext(), "Firebase Facebook login failed", Toast.LENGTH_SHORT).show(); if(task.getException() instanceof FirebaseAuthUserCollisionException) { Toast.makeText(getApplicationContext(), "User with Email id already exists", Toast.LENGTH_SHORT).show(); } LoginManager.getInstance().logOut(); } } }); }
Crédito: Compruebe si existe correo electrónico
Acerca de FirebaseAuthUserCollisionException: https://developers.google.com/android/reference/com/google/firebase/auth/FirebaseAuthUserCollisionException
Impedir que los usuarios creen varias cuentas utilizando la misma dirección de correo electrónico con diferentes proveedores de autenticación. Consulta https://support.google.com/firebase/answer/6400716