使用Firebase通过Facebook登录时的身份验证问题

时间:2019-04-26 06:14:13

标签: android firebase firebase-authentication facebook-login

通过Facebook单击登录按钮后,它已成功登录,但显示身份验证错误。无法将用户存储在Firebase中。我正在使用此库    实现'com.facebook.android:facebook-login:4.42.0' 我也尝试使用下面的库,如文档中所述 实现'com.facebook.android:facebook-android-sdk:[4,5)

通过Facebook登录后,我无法打开新活动 吐司消息的 handleFacebookAccessToken 方法打印并显示身份验证错误

Logcat

2019-04-26 11:28:09.091 29437-29437/com.sample.app.mysampleapp I/Choreographer: Skipped 3 frames!  The application may be doing too much work on its main thread.
2019-04-26 11:28:09.098 29437-29486/com.sample.app.mysampleapp V/FA: Recording user engagement, ms: 8070
2019-04-26 11:28:09.100 29437-29486/com.sample.app.mysampleapp V/FA: Connecting to remote service
2019-04-26 11:28:09.104 29437-29486/com.sample.app.mysampleapp V/FA: Activity paused, time: 1239980723
2019-04-26 11:28:09.115 29437-29486/com.sample.app.mysampleapp D/FA: Logging event (FE): user_engagement(_e), Bundle[{firebase_event_origin(_o)=auto, engagement_time_msec(_et)=8070, firebase_screen_class(_sc)=LoginActivity, firebase_screen_id(_si)=-7653191600035363065}]
2019-04-26 11:28:09.122 29437-29437/com.sample.app.mysampleapp V/FA: onActivityCreated
2019-04-26 11:28:09.146 29437-29486/com.sample.app.mysampleapp V/FA: Connection attempt already in progress
2019-04-26 11:28:09.161 29437-29486/com.sample.app.mysampleapp D/FA: Logging event (FE): screen_view(_vs), Bundle[{firebase_event_origin(_o)=auto, firebase_previous_class(_pc)=LoginActivity, firebase_previous_id(_pi)=-7653191600035363065, firebase_screen_class(_sc)=FacebookActivity, firebase_screen_id(_si)=-7653191600035363064}]
2019-04-26 11:28:09.188 29437-29486/com.sample.app.mysampleapp V/FA: Connection attempt already in progress
2019-04-26 11:28:09.188 29437-29486/com.sample.app.mysampleapp V/FA: Connection attempt already in progress
2019-04-26 11:28:09.189 29437-29486/com.sample.app.mysampleapp V/FA: Activity resumed, time: 1239980786
2019-04-26 11:28:09.239 29437-29437/com.sample.app.mysampleapp I/Choreographer: Skipped 1 frames!  The application may be doing too much work on its main thread.
2019-04-26 11:28:09.240 29437-29486/com.sample.app.mysampleapp D/FA: Connected to remote service
2019-04-26 11:28:09.241 29437-29486/com.sample.app.mysampleapp V/FA: Processing queued up service tasks: 4
2019-04-26 11:28:09.704 29437-29437/com.sample.app.mysampleapp D/com.facebook.FacebookSdk: getGraphApiVersion: v3.2
2019-04-26 11:28:09.706 29437-29437/com.sample.app.mysampleapp D/com.facebook.GraphRequestAsyncTask: execute async task: {RequestAsyncTask:  connection: null, requests: [{Request:  accessToken: null, graphPath: me, graphObject: null, httpMethod: GET, parameters: Bundle[{access_token=EAAcpUSrdafkBAHlfFAh65ogbWq8grz7kZAVSr7SR8eRHOY3hHCUYWKMae8DxH0ocmf7IoobMBvlL0dtbBEKLeGZBeoOLvjNwlDxmXNjb3PnyosVHf8Xzf2GYNc9qoS1dV0bUJzLiNglpkg4OThnFJU1tbvloG8wRlsyOKqLlqyY2vrxbZB6sLZA2A9SHGOhZAFX6QjEz0VuEHVnZBBF9ikwWasoHdlSHcZD, fields=id,name,first_name,middle_name,last_name,link}]}]}
2019-04-26 11:28:09.729 29437-29512/com.sample.app.mysampleapp D/libc-netbsd: [getaddrinfo]:  hostname=graph.facebook.com;  servname=(null);  app_pid=29437;  app_uid=10257;  ai_flags=1024;  ai_family=0; ai_socktype=1 from prox result 0
2019-04-26 11:28:10.476 29437-29486/com.sample.app.mysampleapp V/FA: Recording user engagement, ms: 1318
2019-04-26 11:28:10.486 29437-29486/com.sample.app.mysampleapp V/FA: Activity paused, time: 1239982103
2019-04-26 11:28:10.495 29437-29486/com.sample.app.mysampleapp D/FA: Logging event (FE): user_engagement(_e), Bundle[{firebase_event_origin(_o)=auto, engagement_time_msec(_et)=1318, firebase_screen_class(_sc)=FacebookActivity, firebase_screen_id(_si)=-7653191600035363064}]
2019-04-26 11:28:10.522 29437-29437/com.sample.app.mysampleapp I/Choreographer: Skipped 1 frames!  The application may be doing too much work on its main thread.
2019-04-26 11:28:10.553 29437-29437/com.sample.app.mysampleapp I/loginactivity: HelloEAAcpUSrdafkBAHlfFAh65ogbWq8grz7kZAVSr7SR8eRHOY3hHCUYWKMae8DxH0ocmf7IoobMBvlL0dtbBEKLeGZBeoOLvjNwlDxmXNjb3PnyosVHf8Xzf2GYNc9qoS1dV0bUJzLiNglpkg4OThnFJU1tbvloG8wRlsyOKqLlqyY2vrxbZB6sLZA2A9SHGOhZAFX6QjEz0VuEHVnZBBF9ikwWasoHdlSHcZD
2019-04-26 11:28:10.554 29437-29437/com.sample.app.mysampleapp D/loginactivity: handleFacebookAccessToken:{AccessToken token:EAAcpUSrdafkBAHlfFAh65ogbWq8grz7kZAVSr7SR8eRHOY3hHCUYWKMae8DxH0ocmf7IoobMBvlL0dtbBEKLeGZBeoOLvjNwlDxmXNjb3PnyosVHf8Xzf2GYNc9qoS1dV0bUJzLiNglpkg4OThnFJU1tbvloG8wRlsyOKqLlqyY2vrxbZB6sLZA2A9SHGOhZAFX6QjEz0VuEHVnZBBF9ikwWasoHdlSHcZD permissions:[public_profile, email]}
2019-04-26 11:28:10.567 29437-29437/com.sample.app.mysampleapp W/BiChannelGoogleApi: [FirebaseAuth: ] getGoogleApiForMethod() returned Gms: com.google.firebase.auth.api.internal.zzal@e41d04e
2019-04-26 11:28:10.618 29437-29437/com.sample.app.mysampleapp D/AccessTokenTracker: AccessTokenChanged
2019-04-26 11:28:10.619 29437-29437/com.sample.app.mysampleapp I/Choreographer: Skipped 1 frames!  The application may be doing too much work on its main thread.
2019-04-26 11:28:10.630 29437-29486/com.sample.app.mysampleapp D/FA: Logging event (FE): screen_view(_vs), Bundle[{firebase_event_origin(_o)=auto, firebase_previous_class(_pc)=FacebookActivity, firebase_previous_id(_pi)=-7653191600035363064, firebase_screen_class(_sc)=LoginActivity, firebase_screen_id(_si)=-7653191600035363065}]
2019-04-26 11:28:10.720 29437-29486/com.sample.app.mysampleapp V/FA: Activity resumed, time: 1239982236
2019-04-26 11:28:12.865 29437-29524/com.sample.app.mysampleapp D/com.facebook.FacebookSdk: getGraphApiVersion: v3.2
2019-04-26 11:28:12.986 29437-29524/com.sample.app.mysampleapp D/libc-netbsd: [getaddrinfo]:  hostname=graph.facebook.com;  servname=(null);  app_pid=29437;  app_uid=10257;  ai_flags=1024;  ai_family=0; ai_socktype=1 from prox result 0
2019-04-26 11:28:13.533 29437-29437/com.sample.app.mysampleapp I/Choreographer: Skipped 1 frames!  The application may be doing too much work on its main thread.
2019-04-26 11:28:15.722 29437-29486/com.sample.app.mysampleapp V/FA: Inactivity, disconnecting from the service

LoginActivity.java

public class LoginActivity extends AppCompatActivity {
    ImageView imgV_close;
    TextView txtv_new_user,txtv_fb_signin,txtv_google_signin;
    Button btn_login;
    EditText input_email_login,input_password_login;

    private static final int RC_SIGN_IN = 234;
    private static final String TAG = "loginactivity";
    GoogleSignInClient mGoogleSignInClient;
    GoogleApiClient mGoogleApiClient;
    FirebaseAuth mAuth;


    private FirebaseAuth.AuthStateListener mAuthListener;
    LoginButton loginButton;
    CallbackManager mCallbackManager;
    String name;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        //first we intialized the FirebaseAuth object
        mAuth = FirebaseAuth.getInstance();
        mCallbackManager = CallbackManager.Factory.create();


        input_email_login=findViewById(R.id.input_email_login);
        input_password_login=findViewById(R.id.input_password_login);
        loginButton = (LoginButton) findViewById(R.id.login_button_fb);
        txtv_google_signin=findViewById(R.id.txtv_google_signin);
        imgV_close=findViewById(R.id.imgV_close);
        txtv_new_user=findViewById(R.id.txtv_new_user);
        btn_login=findViewById(R.id.btn_login);

        //Then we need a GoogleSignInOptions object
        //And we need to build it as below
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(getString(R.string.default_web_client_id))
                .requestEmail()
                .build();

        //Then we will get the GoogleSignInClient object from GoogleSignIn class
        mGoogleSignInClient = GoogleSignIn.getClient(this, gso);



     imgV_close.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                LoginActivity.this.finish();
            }
        });

        txtv_new_user.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent sign_up=new Intent(LoginActivity.this,SignupActivity.class);
                startActivity(sign_up);
            }
        });

        btn_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                userLogin();
            }
        });

        txtv_google_signin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                googleSignIn();
            }
        });
        loginButton.setReadPermissions("email", "public_profile");
        loginButton.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {

                Log.i(TAG,"Hello"+loginResult.getAccessToken().getToken());
                //  Toast.makeText(MainActivity.this, "Token:"+loginResult.getAccessToken(), Toast.LENGTH_SHORT).show();

                handleFacebookAccessToken(loginResult.getAccessToken());
            }

            @Override
            public void onCancel() {
                Log.d(TAG, "facebook:onCancel");
            }

            @Override
            public void onError(FacebookException error) {
                Log.d(TAG, "facebook:onError", error);
            }
        });

        mAuthListener = new FirebaseAuth.AuthStateListener(){


            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {

                FirebaseUser user = firebaseAuth.getCurrentUser();

                if (user!=null){
                    name = user.getDisplayName();
                    Toast.makeText(LoginActivity.this,""+user.getDisplayName(),Toast.LENGTH_LONG).show();
                }else {
                    Toast.makeText(LoginActivity.this,"something went wrong",Toast.LENGTH_LONG).show();
                }


            }
        };

    }

    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) {

                        if (task.isSuccessful()) {
                            Log.w(TAG, "signInWithCredential", task.getException());
                            Toast.makeText(LoginActivity.this, "Success", Toast.LENGTH_SHORT).show();
                            Intent intent = new Intent(LoginActivity.this, DeleteActivity.class);
                            startActivity(intent);
                        }else{
                            Toast.makeText(LoginActivity.this, "Authentication error",
                                    Toast.LENGTH_SHORT).show();
                        }
                    }
                });
    }


    @Override
    protected void onStart() {
        super.onStart();
        //if the user is already signed in
        //we will close this activity
        //and take the user to profile activity
        if (mAuth.getCurrentUser() != null) {
            finish();
            startActivity(new Intent(this, MyAccountActivity.class));
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // Pass the activity result back to the Facebook SDK


        //if the requestCode is the Google Sign In code that we defined at starting
        if (requestCode == RC_SIGN_IN) {

            //Getting the GoogleSignIn Task
            Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
            try {
                //Google Sign In was successful, authenticate with Firebase
                GoogleSignInAccount account = task.getResult(ApiException.class);

                //authenticating with firebase
                firebaseAuthWithGoogle(account);
            } catch (ApiException e) {
                Toast.makeText(LoginActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();

            }
        }
        else{
            mCallbackManager.onActivityResult(requestCode, resultCode, data);
        }
    }

    private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
        Log.d(TAG, "firebaseAuthWithGoogle:" + acct.getId());

        //getting the auth credential
        AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);

        //Now using firebase we are signing in the user here
        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            Log.d(TAG, "signInWithCredential:success");
                            FirebaseUser user = mAuth.getCurrentUser();


                            Intent intent = new Intent(LoginActivity.this, MyAccountActivity.class);
                            startActivity(intent);
                            LoginActivity.this.finish();



                        Toast.makeText(LoginActivity.this, "User Signed In", Toast.LENGTH_SHORT).show();
                        } else {
                            // If sign in fails, display a message to the user.
                            Log.w(TAG, "signInWithCredential:failure", task.getException());
                            Toast.makeText(LoginActivity.this, "Authentication failed.",
                                    Toast.LENGTH_SHORT).show();

                        }

                        // ...
                    }
                });
    }


    //this method is called on click
    private void googleSignIn() {
        //getting the google signin intent
        Intent signInIntent = mGoogleSignInClient.getSignInIntent();

        /* Intent signInIntent=Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
        mGoogleApiClient.clearDefaultAccountAndReconnect();*/

        //starting the activity for result
        startActivityForResult(signInIntent, RC_SIGN_IN);

    }



    private void userLogin() {

        final String username = input_email_login.getText().toString().trim();
        final String password = input_password_login.getText().toString().trim();

        if (TextUtils.isEmpty(username)) {
            input_email_login.setError("Please enter your email or password");
            input_email_login.requestFocus();
            return;
        }

        if (TextUtils.isEmpty(password)) {
            input_password_login.setError("Please enter your password");
            input_password_login.requestFocus();
            return;
        }
    }

}

1 个答案:

答案 0 :(得分:0)

您是否已将“ developers.facebook”中的APP ID添加到Firebase项目Authentication中。

相关问题