web-dev-qa-db-fra.com

Champ de messagerie vide de l'utilisateur d'authentification Firebase utilisant l'intégration de la connexion Facebook (Firebase 3.0)

J'ai déployé avec succès le code de didacticiel à partir de https://firebase.google.com/docs/auth/Android/facebook-login pour l'intégration des connexions Firebase Auth à Facebook. Les utilisateurs créés avec succès dans la console Firebase Auth.

Cependant, j'ai remarqué que le champ Email de l'objet utilisateur est vide (-). Étrangement, j'ai récupéré avec succès les informations de messagerie directement à partir des objets de résultat de fournisseur à l'aide de GraphRequest à l'aide du jeton acquis.

D'après la documentation que j'ai lue ( https://firebase.google.com/docs/reference/Android/com/google/firebase/auth/FirebaseUser.html#getEmail () ), le champ de courrier électronique doit être rempli. des fournisseurs de connexion.

Quelques comportements étranges supplémentaires:

  1. Une fois la connexion établie, onAuthStateChanged est appelé deux fois. La valeur De firebaseAuth.getCurrentUser (). GetProviderId () est Firebase À la fois
  2. J'essaie de répertorier les fournisseurs de l'objet FirebaseUser, user.getProviderData (). J'ai deux fournisseurs: firebase et facebook.com
  3. Lorsque j'ai essayé de mettre à jour un courrier électronique à l'aide de FirebaseUser.updateEmail (event.getEmail ()), j'ai eu cette erreur: Une erreur interne s'est produite. [ LE MAIL EXISTE ]

Y a-t-il quelque chose qui me manque ou ai-je mal agi?

Voici mon code:

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

    }
}
17
Muhammad Rayhan

après avoir lu le message dans le groupe gobase-talk de firebase-talk ici https://groups.google.com/forum/#!topic/firebase-talk/gPGNq-IkTLo , j’ai trouvé la réponse. Le problème est dû au fait que j'utilise "Autoriser la création de plusieurs comptes avec la même adresse électronique" dans la méthode de connexion Firebase Auth. 

Donc, je change l'option en: "Empêcher la création de plusieurs comptes avec la même adresse email" peut fonctionner correctement maintenant. C'est simple comme ça. Il est vrai que j'ai besoin de plus de logique pour fusionner des comptes ayant la même adresse e-mail, mais ça va.

Peut-être que tout le monde qui a le même problème peut essayer, et espérons que le problème soit également résolu.

31
Muhammad Rayhan

J'ai trouvé le même problème, où le courrier électronique était réglé sur "-" sur l'authentification de base. Il me manquait la permission de lire le courrier électronique que j'ai corrigé par:

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

J'espère que cela aidera quelqu'un à l'avenir à avoir le même problème.

7

J'ai trouvé la solution . Voici mon code

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

J'ai résolu de cette façon

 _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
                }
            });
0
Erhan Biçer

@Muhammad Rayhan. J'ai aussi fait la même chose. J'ai utilisé FirebaseUser.updateEmail() après avoir reçu le courrier électronique de Fb GraphRequest. Cela a fonctionné sans problèmes.

0
efemoney

J'ai eu le même problème. Cela a été causé par la création de la connexion Facebook sans aucune autorisation de lecture, par la vérification de la connexion, puis par OK, puis l'ajout des autorisations de lecture pour le courrier électronique.

Facebook a montré la boîte de dialogue des autorisations mises à jour, mais Firebase n'a pas récupéré le nouvel email.

Je devais supprimer l'utilisateur dans la console Firebase. Ran l'application à nouveau, connecté, et l'email montre maintenant.

0
ben_the_builder