I'm trying to use Firebase to handle authentication with Facebook logins. I've created the activity by following the documentation on both Firebase's and Facebook's sites and making sure the settings on both sites are filled as needed.
I'm able to log in to Facebook from my app, but when it comes to Firebase saving the user, I get an error:
signInWithCredential com.google.firebase.FirebaseException: An internal error has occurred. [ Access Not Configured. Google Identity Toolkit API has not been used in project 27973105972 before or it is disabled. Enable it by visiting https ]
On Firebase I have for Sign-in providers: Facebook enabled with correct App ID and App secret.
On Facebook I have added the Firebase's redirect URI to the Valid OAuth redirect URIs list.
As a note, searching for Google Identity Toolkit API, leads me to https://developers.google.com/identity/toolkit/ where it says to use Firebase Authentication. So not a very helpful error message.
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Toast;
import com.facebook.AccessToken;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
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;
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
private CallbackManager mCallbackManager;
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Initialize Firebase Auth
mAuth = FirebaseAuth.getInstance();
// [START auth_state_listener]
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
// User is signed in
Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
Toast.makeText(MainActivity.this, "Authentication successful 2.",
Toast.LENGTH_SHORT).show();
} else {
// User is signed out
Log.d(TAG, "onAuthStateChanged:signed_out");
Toast.makeText(MainActivity.this, "Authentication signed out.",
Toast.LENGTH_SHORT).show();
}
// ...
}
};
// [END auth_state_listener]
// Initialize Facebook Login button
mCallbackManager = CallbackManager.Factory.create();
LoginButton loginButton = (LoginButton) findViewById(R.id.login_button);
loginButton.setReadPermissions("email", "public_profile");
loginButton.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Log.d(TAG, "facebook:onSuccess:" + loginResult);
handleFacebookAccessToken(loginResult.getAccessToken());
}
@Override
public void onCancel() {
Log.d(TAG, "facebook:onCancel");
Toast.makeText(MainActivity.this, "facebook onCancel",
Toast.LENGTH_SHORT).show();
// ...
}
@Override
public void onError(FacebookException error) {
Log.d(TAG, "facebook:onError", error);
Toast.makeText(MainActivity.this, "facebook onError",
Toast.LENGTH_SHORT).show();
// ...
}
});
// [END initialize_fblogin]
}
@Override
public void onStart() {
super.onStart();
// [START on_start_add_listener]
mAuth.addAuthStateListener(mAuthListener);
}
@Override
public void onStop() {
super.onStop();
// [START on_stop_remove_listener]
if (mAuthListener != null) {
mAuth.removeAuthStateListener(mAuthListener);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Pass the activity result back to the Facebook SDK
mCallbackManager.onActivityResult(requestCode, resultCode, data);
}
// [START auth_with_facebook]
private void handleFacebookAccessToken(AccessToken token) {
Log.d(TAG, "handleFacebookAccessToken:" + token);
AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
Log.d(TAG, "signInWithCredential:onComplete:" + task.isSuccessful());
// If sign in fails, display a message to the user. If sign in succeeds
// the auth state listener will be notified and logic to handle the
// signed in user can be handled in the listener.
if (!task.isSuccessful()) {
Log.w(TAG, "signInWithCredential", task.getException());
Toast.makeText(MainActivity.this, "Authentication failed.",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "Authentication successful.",
Toast.LENGTH_SHORT).show();
}
// ...
}
});
}
}