我正在尝试使用Firebox实施双提供商(Facebook& Google)登录活动。我已经使用以下方案测试了这个系统,注销是通过一个按钮完成的,该按钮调用下面定义的signOut()
方法:
方案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();
}
}
});
}
答案 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和社区维护。