Google Firebase在Android应用中注销并忘记用户

时间:2016-08-01 19:59:34

标签: android firebase google-play-services firebase-authentication

当我致电mFirebaseAuth.signOut()mFirebaseUser.delete()我的FirebaseAuth.AuthStateListener()正常工作并在null中将FirebaseUser作为onAuthStateChanged实例返回时,我刷新了用户界面显示"使用Google登录"按钮。

但是当我想再次登录时,我没有看到与用户的对话(我的设备上有2个用户,附加了图像)。该应用程序仅在首次登录时显示此对话框,之后它使用相同的用户。如果我在设置屏幕上清除应用程序的数据,我将能够再次看到此对话框。

我的问题是如何在每次退出后显示此对话框。

enter image description here

按下登录按钮时运行此代码:

// in onCreate()
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(getString(R.string.default_web_client_id))
                .requestEmail()
                .build();
mGoogleApiClient = new GoogleApiClient.Builder(this)
                .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
                .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                .build();

// in OnClickListener
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
            startActivityForResult(signInIntent, FirebaseActivity.REQUEST_SIGN_IN);

onActivityResult()中,我得到GoogleSignInResult的实例,因此在我致电startActivityForResult()之后,我需要的一切都会发生。

10 个答案:

答案 0 :(得分:36)

Firebase Auth Quickstart sample code中,Google提供商的退出包含以下步骤。你在退出时打电话给GoogleSignInClient.signOut()吗?

private void signOut() {
    // Firebase sign out
    mAuth.signOut();

    // Google sign out
    mGoogleSignInClient.signOut().addOnCompleteListener(this,
            new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    updateUI(null);
                }
            });
}

答案 1 :(得分:8)

另一种选择是使用FirebaseUI库。它简化了登录退出操作,因为它将为您完成所有繁重的任务。

<强> 科特林

AuthUI.getInstance().signOut(this).addOnCompleteListener { 
    // do something here 
}

<强> 爪哇

AuthUI.getInstance()
      .signOut(ActivityMainOld.this)
      .addOnCompleteListener(new OnCompleteListener<Void>(){

          @Override
          public void onComplete(@NonNull Task<Void> task) {

              // do something here

          }
      });

希望这有帮助

答案 2 :(得分:3)

对于其他任何想要此结果的用户(如将Google帐户选项重新用于其他活动)。

public static void signOut() {
    // Firebase sign out
    mAuth.signOut();

    // Google sign out
    Auth.GoogleSignInApi.signOut(mGoogleApiClient);
}

在登录页面上添加此内容,在转到下一个活动之前,只需致电SignOut()

// everything ok...             
signOut();
startActivity(new Intent(SignIn.this,NextOne.class));

然后,在您的其他课程中,您可以致电

FirebaseAuth.getInstance().signOut();
startActivity(new Intent(NextClass.this, SignIn.class));

这很容易,而且会有效。干杯!

答案 3 :(得分:2)

你也可以定义这样的东西:

private void signOut() {
    mAuth.signOut();
    mGoogleSignInClient.signOut().addOnCompleteListener(this,
            new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    Intent intent = new Intent(YourActivity.this, NextActivity.class);
                    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(intent);
                }
            });
}

答案 4 :(得分:0)

private void sendToLogin() { //funtion
    GoogleSignInClient mGoogleSignInClient ;
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
        .requestIdToken(getString(R.string.default_web_client_id))
        .requestEmail()
        .build();
    mGoogleSignInClient = GoogleSignIn.getClient(getBaseContext(), gso);
    mGoogleSignInClient.signOut().addOnCompleteListener(/*CURRENT CLASS */.this,
        new OnCompleteListener<Void>() {  //signout Google
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                FirebaseAuth.getInstance().signOut(); //signout firebase
                Intent setupIntent = new Intent(getBaseContext(), /*To ur activity calss*/);
                Toast.makeText(getBaseContext(), "Logged Out", Toast.LENGTH_LONG).show(); //if u want to show some text
                setupIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(setupIntent);
                finish();
            }
        });
}

这段代码是作为副本编写的,只是在代码中读取 COMMENTS 以根据您的需要自定义它,我更喜欢将用户发送到登录

答案 5 :(得分:0)

我做了mGoogleSignInClient.signOut() 这是按预期工作的。

答案 6 :(得分:0)

您可以为GoogleAuthProvider设置自定义参数,以强制用户通过google重新验证。

var provider = new Firebase.auth.GoogleAuthProvider();
      provider.setCustomParameters({
        prompt: 'select_account'
      });

答案 7 :(得分:0)

我很困惑,因为所有解决方案都需要引用GoogleSignInClient,但是实际上并不需要您保留对它的引用,您只需创建一个新实例并调用{{1 }} 在上面。

signOut()

答案 8 :(得分:0)

以上均未为我解决问题

  1. 接受的答案需要访问登录视图中定义的mGoogleApiClient(通常在设置视图中为注销按钮)

  2. 另一个答案是建议在登录视图中注销(成功登录之后,然后才启动主视图)。这是在解决mGoogleApiClient的可访问性问题,但是这种方法的问题是,每次用户打开应用程序时,该应用程序都会在登录视图中结束,并且每次登录都不理想。

这就是我最终要做的事情,它是一种全方位修复程序,支持所有第三方注销选项(在我的情况下为Facebook和Google)

    logOutButton.setOnSingleClickListener {
            FirebaseAuth.getInstance().currentUser?.getIdToken(false)?.addOnSuccessListener {
                    result ->
                when (result.signInProvider){
                    "facebook.com" -> {
                        LoginManager.getInstance().logOut()
                        signOutFromApp()
                    }
                    "google.com" -> {
                        GoogleSignIn.getClient(
                            this,
                            GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).build()
                        ).signOut()
                        signOutFromApp()
                    }
                    else -> {
                        signOutFromApp()
                    }
                }
            }
        }

   private fun signOutFromApp() {
        FirebaseAuth.getInstance().signOut()
        LauncherActivity.start(this) //starts login view
        finish() //finish settigs view 
    }

答案 9 :(得分:0)

使用 Firebase Auth 和 GoogleSignInClient 的相同实例,
例如,如果我们在 LoginActivity 中声明并实例化了一个名为 mAuth 的 Firebase Auth,
那么如果我们在其他activity中声明一个新的mAuth,尝试调用mAuth.login,就无法正常工作。
将 Firebase Auth 和 GoogleSignInClient 变量设为公开和静态,并在其他活动中使用相同的变量