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)

He implementado con éxito el código tutorial de https://firebase.google.com/docs/auth/android/facebook-login para integrar los inicios de sesión de Firebase Auth con Facebook. Los usuarios creados correctamente en la consola de Firebase Auth.

Sin embargo, noté que el campo del email en el objeto del usuario es vacío (-). Curiosamente, recuperé la información de correo electrónico directamente de los objetos de resultado del proveedor utilizando GraphRequest utilizando el token adquirido.

Sobre la base de la documentación que leí ( https://firebase.google.com/docs/reference/android/com/google/firebase/auth/FirebaseUser.html#getEmail () ), el campo de correo electrónico se debe rellenar desde los proveedores de inicio de sesión.

Algunos extraños comportamiento extraño:

  1. Después de una conexión exitosa, el onAuthStateChanged se llama dos veces. El valor de firebaseAuth.getCurrentUser (). GetProviderId () es Firebase en ambas ocasiones
  2. Intento enumerar abajo de los abastecedores del objeto de FirebaseUser, user.getProviderData (). Tengo dos proveedores: firebase y facebook.com
  3. Cuando intenté actualizar el email usando FirebaseUser.updateEmail (event.getEmail ()), conseguí este error: Se ha producido un error interno. [ EXISTE EL EMAIL ]

¿Hay algo que extraño o hice algo mal?

Aquí está mi código:

public class LoginActivity extends AppCompatActivity { private static final String TAG = "LOGIN_ACTIVITY"; private static final int RC_SIGN_IN = 777; private EventBus eventBus; private SweetAlertDialog pDialog; private FirebaseAuth mAuth; private FirebaseAuth.AuthStateListener mAuthListener; private CallbackManager mCallbackManager; private ImageView mPasswordVisibilityView; private TextView txtPassword; private boolean justEnteredAuthStateChanged = false; private GoogleApiClient mGoogleApiClient; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); FacebookSdk.sdkInitialize(getApplicationContext()); setContentView(R.layout.login); // Firebase mAuth = FirebaseAuth.getInstance(); mAuthListener = new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(@NonNull final FirebaseAuth firebaseAuth) { final FirebaseUser user = firebaseAuth.getCurrentUser(); if (user != null) { // User is signed in Util.logassert("Auth Provider = " + firebaseAuth.getCurrentUser().getProviderId()); // this is called twice, values of Provider = Firebase Util.logassert("total provider = " + user.getProviderData().size()); // output = 2. "Firebase" and "facebook.com" for (int i = 0; i < user.getProviderData().size(); i++) { UserInfo info = user.getProviderData().get(i); Util.logassert(info.getProviderId() + ", email = " + info.getEmail()); // both empty Util.logassert("current provider = " + info.getProviderId() + " - " + info); } } else { Util.logassert("onAuthStateChanged user logged out"); } // ... } }; mAuth.addAuthStateListener(mAuthListener); // Firebase Facebook TapAuth // Initialize Facebook Login button mCallbackManager = CallbackManager.Factory.create(); LoginManager.getInstance().registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() { @Override public void onSuccess(LoginResult loginResult) { Util.logassert("facebook:onSuccess:" + loginResult); handleFacebookAccessToken(loginResult.getAccessToken()); Util.logassert("granted = " + loginResult.getRecentlyGrantedPermissions()); // output [email and public_profile] Util.logassert("denied = " + loginResult.getRecentlyDeniedPermissions()); } @Override public void onCancel() { Util.logassert("facebook:onCancel"); // ... } @Override public void onError(FacebookException error) { Util.logassert("facebook:onError" + error.getMessage()); // ... } }); FancyButton btnFacebook = (FancyButton) findViewById(R.id.btn_facebook_share); btnFacebook.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { LoginManager.getInstance().logInWithReadPermissions(LoginActivity.this, Arrays.asList("public_profile", "email")); Util.logassert("try facebook login"); } }); txtPassword = (EditText) findViewById(R.id.input_password); } private void handleFacebookAccessToken(AccessToken token) { Util.logassert("handleFacebookAccessToken:" + token); GraphRequest request = GraphRequest.newMeRequest( token, new GraphRequest.GraphJSONObjectCallback() { @Override public void onCompleted( JSONObject object, GraphResponse response) { // Application code Log.v("LoginActivity", response.toString()); Util.logassert("graph res = " + response.getRawResponse()); try { /* successfully output email address from graph request here */ FbGraphEvent event = new FbGraphEvent(response.getJSONObject().getString("email"), response.getJSONObject().getString("name")); EventBus.getDefault().postSticky(event); } catch (Exception e) { Log.e("MomInvoice", "Error in parsing json fb graph", e); } } }); Bundle parameters = new Bundle(); parameters.putString("fields", "email,name"); request.setParameters(parameters); request.executeAsync(); AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken()); mAuth.signInWithCredential(credential) .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { Util.logassert("signInWithCredential:onComplete:" + task.isSuccessful()); if (!task.isSuccessful()) { Util.logassert("signInWithCredential failed coz = " + task.getException().getMessage()); Toast.makeText(LoginActivity.this, "Authentication failed :(", Toast.LENGTH_SHORT).show(); } } }); } @Override public void onStart() { super.onStart(); Util.logassert("masuk onStart LoginActivity"); } @Override protected void onStop() { super.onStop(); } @Override protected void onDestroy() { if (mAuthListener != null) { mAuth.removeAuthStateListener(mAuthListener); } super.onDestroy(); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (mCallbackManager != null) { mCallbackManager.onActivityResult(requestCode, resultCode, data); Util.logassert("hasilx " + requestCode + " = " + resultCode); } } } 

Después de leer el post en firebase-talk google grupo aquí https://groups.google.com/forum/#!topic/firebase-talk/gPGNq-IkTLo , me enteré de la respuesta. El problema se produjo porque estoy usando "Permitir la creación de varias cuentas con la misma dirección de correo electrónico" en el método de inicio de sesión de Firebase Auth.

Así que cambio la opción en: "Impedir la creación de varias cuentas con la misma dirección de correo electrónico", puede estar funcionando correctamente ahora. Es muy sencillo. Es cierto que necesito más lógica para fusionar cuentas con la misma dirección de correo electrónico, pero está bien.

Tal vez todos los demás que tienen el mismo problema, también puede intentar esto, y es de esperar que se resuelve también.

He encontrado el mismo problema, donde el correo electrónico se estableció en "-" en firebase auth. Yo estaba perdiendo el permiso para leer el correo electrónico, que lo arreglé por:

 LoginButton mFacebookSignInButton = (LoginButton) findViewById(R.id.facebook_sign_in_button); mFacebookSignInButton.setReadPermissions("email", "public_profile"); 

Espero que esto ayude a alguien en el futuro teniendo el mismo problema.

Encontré la solución. Aquí está mi código

 import android.app.ProgressDialog; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageButton; import com.app.pizzawheel.Common.Globals; import com.facebook.AccessToken; import com.facebook.AccessTokenTracker; import com.facebook.CallbackManager; import com.facebook.FacebookCallback; import com.facebook.FacebookException; import com.facebook.FacebookSdk; import com.facebook.GraphRequest; import com.facebook.GraphResponse; import com.facebook.login.LoginManager; import com.facebook.login.LoginResult; import com.facebook.login.widget.LoginButton; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.auth.AuthCredential; import com.google.firebase.auth.AuthResult; import com.google.firebase.auth.FacebookAuthProvider; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; import android.support.annotation.NonNull; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.Arrays; public class GetStartedActivity extends AppCompatActivity { CallbackManager callbackManager; AccessTokenTracker accessTokenTracker; AccessToken accessToken; private FirebaseAuth mAuth; ProgressDialog progress; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); FacebookSdk.sdkInitialize(this.getApplicationContext()); setContentView(R.layout.activity_getstarted); getSupportActionBar().hide(); mAuth = FirebaseAuth.getInstance(); callbackManager = CallbackManager.Factory.create(); final LoginButton loginButton = (LoginButton) findViewById(R.id.fb_login); final ImageButton btnFBLogin = (ImageButton)findViewById(R.id.btn_fb_login); loginButton.setReadPermissions("email", "public_profile"); if (loginButton != null) { loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { @Override public void onSuccess(LoginResult loginResult) { // App code loginButton.setVisibility(View.INVISIBLE); btnFBLogin.setVisibility(View.VISIBLE); accessToken = loginResult.getAccessToken(); FBLogin(); } @Override public void onCancel() { // App code } @Override public void onError(FacebookException exception) { // App code } }); } if(AccessToken.getCurrentAccessToken()!=null) { accessToken = AccessToken.getCurrentAccessToken(); btnFBLogin.setVisibility(View.VISIBLE); } btnFBLogin.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { FBLogin(); } }); } private void FBLogin(){ progress = new ProgressDialog(GetStartedActivity.this); progress.setMessage("Please Wait..."); progress.setProgressStyle(ProgressDialog.STYLE_SPINNER); progress.setCancelable(false); progress.show(); AuthCredential credential = FacebookAuthProvider.getCredential(accessToken.getToken()); mAuth.signInWithCredential(credential) .addOnCompleteListener(GetStartedActivity.this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { GraphRequest request = GraphRequest.newMeRequest(accessToken, new GraphRequest.GraphJSONObjectCallback(){ @Override public void onCompleted(JSONObject object, GraphResponse response) { progress.hide(); progress.dismiss(); try { Globals.email_address = object.getString("email"); Globals.first_name = object.getString("first_name"); Globals.last_name = object.getString("last_name"); } catch (JSONException e) { e.printStackTrace(); } Intent intent = new Intent(GetStartedActivity.this, WelcomeActivity.class); startActivity(intent); finish(); } }); Bundle parameters = new Bundle(); parameters.putString("fields","id,email,first_name,last_name"); request.setParameters(parameters); request.executeAsync(); // Sign in success, update UI with the signed-in user's information } else { progress.hide(); progress.dismiss(); // If sign in fails, display a message to the user. // Log.w(TAG, "signInWithCredential:failure", task.getException()); // Toast.makeText(FacebookLoginActivity.this, "Authentication failed.", // Toast.LENGTH_SHORT).show(); // updateUI(null); } } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); callbackManager.onActivityResult(requestCode, resultCode, data); } @Override public void onDestroy() { super.onDestroy(); } } 

@Muhammad Rayhan. Yo también hice lo mismo. Utilicé FirebaseUser.updateEmail() después de recibir el correo electrónico de Fb GraphRequest. Funcionó sin problemas.

Yo tuve el mísmo problema. Fue causado por la creación del inicio de sesión de Facebook sin ningún permiso de lectura, probado el inicio de sesión, todo está bien – luego agregó los permisos de lectura para el correo electrónico.

Facebook mostró el diálogo de permisos actualizado, pero Firebase no agarró el nuevo correo electrónico.

Tuve que eliminar el usuario en la consola de Firebase. Ejecutó la aplicación de nuevo, se conectó y se muestra el correo electrónico.

  • Android Firebase Auth - Obtener la foto del usuario
  • Firebase: No se pueden resolver las bibliotecas de google auth y GoogleSignInResult
  • Salir correctamente de un usuario de la aplicación Android
  • FirebaseUI auth se está estrellando en android
  • Descripción de la función createUser de firebase (específicamente la biblioteca android)
  • Error en la entrada de Facebook de Android
  • La verificación de correo electrónico de Firebase no funciona correctamente
  • Android con el cambio de hora de la fecha, pero poner a tiempo de nuevo, Firebase acaba de devolver símbolo expirado
  • No puedo registrarme usando el módulo de firebase auth
  • No se encontró el archivo de clase de com.google.android.gms.internal.zzaja
  • ¿Cómo enviar correo electrónico de verificación con Firebase?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.