studio developers con auth android firebase firebase-authentication facebook-authentication

android - developers - firebase facebook login web



Campo de correo electrónico vacío del usuario de Firebase Auth que utiliza la integración de inicio de sesión de Facebook(Firebase 3.0) (7)

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

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

Sin embargo, noté que el campo Correo electrónico en el objeto de usuario está vacío (-). Extrañamente, recuperé con éxito la información de correo electrónico directamente de los objetos de resultados 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 debe completarse con los proveedores de inicio de sesión.

Algunos comportamientos extraños adicionales:

  1. Después de iniciar sesión correctamente, se llama dos veces al onAuthStateChanged. El valor de firebaseAuth.getCurrentUser (). GetProviderId () es Firebase en ambas ocasiones
  2. Intento enumerar los proveedores del objeto FirebaseUser, user.getProviderData (). Tengo dos proveedores: firebase y facebook.com
  3. Cuando intenté actualizar el correo electrónico utilizando FirebaseUser.updateEmail (event.getEmail ()), recibí este error: Se produjo un error interno. [ EXISTE EL EMAIL ]

¿Hay algo que echo de menos 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); } } }


Encontré el mismo problema, donde el correo electrónico se configuró como "-" en la autenticación firebase. Me faltaba el permiso para leer el correo electrónico, que reparé en:

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

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


Encontré la solución. Aqui esta mi codigo

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(); } }


Resolví de esta manera

_facebookLoginButton.setReadPermissions(Arrays.asList( "email", "public_profile")); _facebookLoginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { @Override public void onSuccess(LoginResult loginResult) { credential = FacebookAuthProvider.getCredential(facebookAccessToken.getToken()); GraphRequest request = GraphRequest.newMeRequest( loginResult.getAccessToken(), (me, response) -> { if (response.getError() != null) { // handle error hideProgress(); Logcum.w(" GirisActivity ", "facebookSignIn: Giriş anında hata oluştu", response.getError().getException()); } else { user_email = response.getJSONObject().optString("email"); facebookSignInCredential(user_email); } }); Bundle parameters = new Bundle(); parameters.putString("fields", "email"); request.setParameters(parameters); request.executeAsync(); } @Override public void onCancel() { Log.d(TAG, "facebook:onCancel"); hideProgress(); // progresi gizle } @Override public void onError(FacebookException error) { Log.d(TAG, "facebook:onError", error); hideProgress(); // progresi gizle } });


Yo tuve el mísmo problema. Esto se debió a la creación del inicio de sesión de Facebook sin permisos de lectura, se probó el inicio de sesión, todo fue correcto y luego se agregaron los permisos de lectura para el correo electrónico.

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

Tuve que eliminar al usuario en la consola firebase. Corrió la aplicación de nuevo, se conectó y ahora se muestra el correo electrónico.


después de leer la publicación en el grupo de google firebase-talk aquí https://groups.google.com/forum/#!topic/firebase-talk/gPGNq-IkTLo , encontré 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 a: "Impedir la creación de varias cuentas con la misma dirección de correo electrónico" puede funcionar correctamente ahora. Es tan simple como eso. Es cierto que necesito más lógica para combinar cuentas que tengan la misma dirección de correo electrónico, pero está bien.

Tal vez todos los demás tengan el mismo problema, también pueden intentar esto, y espero que también se resuelva.


Algunas cuentas de Facebook se crean utilizando números móviles , por lo que cada vez que solicitamos una dirección de correo electrónico obtenemos una cadena vacía .

En la siguiente imagen, puede ver que la cuenta de Facebook puede configurar su contacto principal como dirección de correo electrónico o número de teléfono móvil . Por lo tanto, si una persona ha marcado el número de móvil como principal, no podrá recuperar su dirección de correo electrónico.

En mi caso, me olvidé de verificar mi cuenta de Facebook , por lo que inicialmente mi dirección de correo electrónico ni siquiera aparecía en el contacto principal. Por lo tanto, si no obtiene la dirección de correo electrónico, vaya a Configuración general y vea si la cuenta principal está configurada para la dirección de correo electrónico o no.