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