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:
- Después de iniciar sesión correctamente, se llama dos veces al onAuthStateChanged. El valor de firebaseAuth.getCurrentUser (). GetProviderId () es Firebase en ambas ocasiones
- Intento enumerar los proveedores del objeto FirebaseUser, user.getProviderData (). Tengo dos proveedores: firebase y facebook.com
- 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.