通过Google登录后无法通过Facebook登录

时间:2016-10-05 13:02:06

标签: android firebase-authentication google-authentication facebook-authentication

我正在尝试使用Firebox实施双提供商(Facebook& Google)登录活动。我已经使用以下方案测试了这个系统,注销是通过一个按钮完成的,该按钮调用下面定义的signOut()方法:

  1. 使用Facebook登录,注销,再次使用Facebook登录。
  2. 使用Facebook登录,注销,使用Google登录。
  3. 使用Google登录,注销,再次使用Google登录。
  4. 使用Google登录,注销,再次使用Facebook登录。
  5. 方案1-3是成功的,但是当我尝试使用Google登录,注销然后使用Facebook登录时,我在{ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL方法中遇到onComplete错误在OnCompleteListener方法中1}}。奇怪的是,这只发生在与谷歌签约后,我怀疑我没有正确实施谷歌的退出机制。

    我的主要活动如下,布局文件未指定,因为它很长,但视图名称是自解释的:

    handleFacebookAccessToken

    记录附件:

    public class MyActivity extends AppCompatActivity implements SKPrepareMapTextureListener, UpdateDbTask.UpdateDbTaskListener, GoogleApiClient.OnConnectionFailedListener, View.OnClickListener {
    private GoogleApiClient mGoogleApiClient;
    private static final int RC_SIGN_IN = 0;
    private FirebaseAuth mAuth;
    private FirebaseAuth.AuthStateListener mAuthListener;
    private CallbackManager mCallbackManager;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FacebookSdk.sdkInitialize(getApplicationContext());
        mAuth = FirebaseAuth.getInstance();
        mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
                if (user != null) {
                    // User is signed in
                    Log.d(Constants.APP_NAME, "onAuthStateChanged:signed_in:" + user.getUid());
                } else {
                    // User is signed out
                    Log.d(Constants.APP_NAME, "onAuthStateChanged:signed_out");
                }
            }
        };
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(Constants.defaultWebClientId)
                .requestEmail()
                .build();
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .enableAutoManage(this, this)
                .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                .build();
        mGoogleApiClient.connect();
        findViewById(R.id.google_sign_in_button).setOnClickListener(this);
    
    
        mCallbackManager = CallbackManager.Factory.create();
        LoginButton loginButton = (LoginButton) findViewById(R.id.facebook_sign_in_button);
        loginButton.setReadPermissions("email", "public_profile");
        loginButton.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                Log.d(Constants.APP_NAME, "facebook:onSuccess:" + loginResult);
                handleFacebookAccessToken(loginResult.getAccessToken());
            }
    
            @Override
            public void onCancel() {
                Log.d(Constants.APP_NAME, "facebook:onCancel");
            }
    
            @Override
            public void onError(FacebookException error) {
                Log.d(Constants.APP_NAME, "facebook:onError", error);
            }
        });
    }
    
    private void handleFacebookAccessToken(AccessToken token) {
        Log.d(Constants.APP_NAME, "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(Constants.APP_NAME, "signInWithCredential:onComplete:" + task.isSuccessful());
                        if (!task.isSuccessful()) {
                            Log.w(Constants.APP_NAME, "signInWithCredential", task.getException());
                            Toast.makeText(MyActivity.this, "Authentication failed.",
                                    Toast.LENGTH_SHORT).show();
                        } else
                            Toast.makeText(MyActivity.this, "Logged in with facebook.",
                                    Toast.LENGTH_LONG).show();
                    }
                });
    }
    
    @Override
    protected void onStart() {
        super.onStart();
        mAuth.addAuthStateListener(mAuthListener);
    }
    
    @Override
    protected void onStop() {
        super.onStop();
        if (mAuthListener != null) {
            mAuth.removeAuthStateListener(mAuthListener);
        }
    }
    
    
    public void signOut() {
        // Firebase sign out
        mAuth.signOut();
    
        // Google sign out
        Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(
                new ResultCallback<Status>() {
                    @Override
                    public void onResult(@NonNull Status status) {
                        Toast.makeText(MyActivity.this, "signed out from google " + status.getStatusMessage(),
                                Toast.LENGTH_LONG).show();
                    }
                });
        LoginManager.getInstance().logOut();
    }
    
    
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.google_sign_in_button:
                signIn();
                break;
    
        }
    }
    
    private void signIn() {
        Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
        startActivityForResult(signInIntent, RC_SIGN_IN);
    }
    
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
        if (requestCode == RC_SIGN_IN) {
            GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
            handleSignInResult(result);
        } else {
            mCallbackManager.onActivityResult(requestCode, resultCode, data);
        }
    }
    
    private void handleSignInResult(GoogleSignInResult result) {
        if (result.isSuccess()) {
            GoogleSignInAccount acct = result.getSignInAccount();
            firebaseAuthWithGoogle(acct);
        } else {
        }
    }
    
    private void firebaseAuthWithGoogle(final GoogleSignInAccount acct) {
        Log.d(Constants.APP_NAME, "firebaseAuthWithGoogle:" + acct.getId());
        AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        Log.d(Constants.APP_NAME, "signInWithCredential:onComplete:"
                                + task.isSuccessful());
                        if (!task.isSuccessful()) {
                            Log.w(Constants.APP_NAME, "signInWithCredential", task.getException());
                            Toast.makeText(MyActivity.this, "Authentication failed.",
                                    Toast.LENGTH_SHORT).show();
                        } else {
                            Toast.makeText(MyActivity.this, "Logged in with google",
                                    Toast.LENGTH_SHORT).show();
                        }
                    }
                });
    }
    

2 个答案:

答案 0 :(得分:1)

请检查主题:https://groups.google.com/forum/#!searchin/firebase-talk/liu/firebase-talk/ms_NVQem_Cw/8g7BFk1IAAAJ它解释了为什么会发生这种情况。这是由于某些安全问题导致Google电子邮件被验证,而Facebook电子邮件却没有。

答案 1 :(得分:0)

不完全回答您的问题,但您知道Firebase UI Auth吗?它的处理合并目前是我的应用程序的帐户,并且回购由firebase和社区维护。