Google Firebase 在 Android 应用中退出并忘记用户

Posted

技术标签:

【中文标题】Google Firebase 在 Android 应用中退出并忘记用户【英文标题】:Google Firebase sign out and forget user in Android app 【发布时间】:2016-12-07 00:33:06 【问题描述】:

当我调用mFirebaseAuth.signOut()mFirebaseUser.delete() 时,我的FirebaseAuth.AuthStateListener() 工作正常并在onAuthStateChanged 中将null 作为FirebaseUser 实例返回,我刷新UI 并显示“使用Google 登录”按钮。

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

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

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

// 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() 之后发生。

【问题讨论】:

代码或者它没有发生。让我们看看你显示弹出窗口的逻辑。 快速猜测:调用 signOut() 会为用户签名 Firebase 身份验证。它不会让用户退出底层社交提供商(例如 Facebook、Google)。因此,下次您启动该提供商的登录流程时,您的代码(或您使用的库)将立即获取它。但是,如果您显示minimal code that reproduces the problem,确实会更容易说出发生了什么。 通过将您的代码与Firebase Auth Quickstart project 进行比较,您可能会得到一些线索。当我使用 Google Signin 运行它时,每次都会显示帐户选择器对话框。不知道这是否适用于 Twitter、Facebook 等。 @FrankvanPuffelen 添加了代码 @qbix 谷歌认证 【参考方案1】:

在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);
                
            );

【讨论】:

不,我没有打电话给Auth.GoogleSignInApi.signOut()。非常感谢,现在可以使用了。 好找到@qbix!我忘记了快速入门代码的那部分。 信用真的归你@FrankvanPuffelen。你之前的评论让我走上了正轨。 我如何获得mGoogleApiClientupdateUI 是做什么的?我如何使用 Facebook 做到这一点?我在一个单独的班级中注销。谢谢 @AbAppletic:查看答案中链接的快速入门示例代码。【参考方案2】:

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

Kotlin

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

Java

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

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

              // do something here

          
      );

希望对你有帮助

【讨论】:

简洁优雅的解决方案 .. 独立,不需要涉及 GoogleApiClient 参考。很好,谢谢! 在使用 Java 8 监听器的项目中使用最新的 Gradle 和 android Studio 更新可以缩短为 .addOnCompleteListener(task -&gt; /* do something here */ );【参考方案3】:

我很困惑,因为所有解决方案都需要引用GoogleSignInClient,但实际上并不需要您持有对它的引用,您可以简单地创建一个新实例并在其上调用signOut() .

GoogleSignIn.getClient(
    getContext(), 
    new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).build()
).signOut();

【讨论】:

【参考方案4】:

对于希望在其他活动中获得此结果(如恢复 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));

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

【讨论】:

【参考方案5】:

你也可以这样定义:

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

【讨论】:

【参考方案6】:
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();
            
        );

这段代码是为了复制过去而编写的

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

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

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

【讨论】:

【参考方案9】:

以上都没有为我解决问题

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

    另一个答案是建议在登录视图中注销(成功登录后和启动到主视图之前)。这是解决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 
    

【讨论】:

【参考方案10】:

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

【讨论】:

以上是关于Google Firebase 在 Android 应用中退出并忘记用户的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio - Firebase 在尝试签署 facebook 或 google 时返回 null

“无法获取提供程序 com.google.firebase.provider.FirebaseInitProvider”错误路径 Android

android google登录后如何初始化firebase?

如果在 Firebase Android 初始注册期间帐户已与 google 关联,则使用 Facebook 登录

Google Firebase 在 Android 应用中退出并忘记用户

检查用户是不是在 Android 的 Firebase Google 身份验证中首次通过身份验证