Ho implementato correttamente il codice di esercitazione da https://firebase.google.com/docs/auth/android/facebook-login per l'integrazione degli accessi di autenticazione Firebase con Facebook. Gli utenti creati con successo nella console di autenticazione di Firebase.Campo di posta elettronica vuoto dell'utente Firebase Utente che utilizza Facebook Login Integration (Firebase 3.0)
Tuttavia, ho notato che il campo Email nell'oggetto utente è vuoto (-). Stranamente, ho recuperato le informazioni e-mail direttamente dagli oggetti risultato del provider usando GraphRequest usando il token acquisito.
In base alla documentazione che ho letto (https://firebase.google.com/docs/reference/android/com/google/firebase/auth/FirebaseUser.html#getEmail()), il campo di posta elettronica deve essere compilato dai provider di accesso.
Alcuni comportamenti strani supplementari:
- Dopo l'accesso, l'onAuthStateChanged viene chiamato due volte. Il valore di firebaseAuth.getCurrentUser(). GetProviderId() è Firebase in entrambe le occasioni
- Si tenta di elencare i provider dall'oggetto FirebaseUser, user.getProviderData(). Ho ottenuto due provider: firebase e facebook.com
- Quando ho provato ad aggiornare l'e-mail utilizzando FirebaseUser.updateEmail (event.getEmail()), ho ricevuto questo errore: si è verificato un errore interno. [EMAIL_EXISTS]
C'è qualcosa che mi manca o ho fatto qualcosa di sbagliato?
Ecco il mio codice:
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);
}
}
}
Ho lo stesso problema, email vuota dal login di Facebook. Login Google Proverò presto –
Non mi è familiare l'SDK Android, ma mi trovavo di fronte a un problema simile nel javascript sdk w/login di google. A quanto ho capito, Firebase 3.0 non include più i dettagli dell'utente nella risposta iniziale a una chiamata di autenticazione. questo potrebbe essere il motivo per cui la tua chiamata successiva sta restituendo la posta elettronica. hth. http://stackoverflow.com/questions/37618332/firebase-3-additional-auth-scope-data – Brandon
@Muhammad Rayhan, hai mai risolto questo problema? Sto avendo gli stessi problemi. L'email non è contenuta da nessuna parte. Lo stesso per Twitter, ma il login di Twitter in origine richiede un ulteriore passaggio per ottenere e-mail. – efemoney