Pavlo28
Pavlo28

Reputation: 1596

Google Firebase sign out and forget user in Android app

When I call mFirebaseAuth.signOut() or mFirebaseUser.delete() my FirebaseAuth.AuthStateListener() works correctly and returns null as FirebaseUser instance in onAuthStateChanged, I refresh UI and show "Sign in with Google" button.

But when I want to log in again, I don't see the dialog with users (I have 2 users on my device, attached the image). The app shows this dialog only in first sign in, after that it uses the same user. If I clear app's data on the settings screen I will be able to see this dialog again.

My question is how to show this dialog after every sign out.

enter image description here

I run this code when press Sign In button:

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

In onActivityResult(), I get an instance of GoogleSignInResult so everything I need happens after I call startActivityForResult().

Upvotes: 42

Views: 40933

Answers (11)

Soorya
Soorya

Reputation: 701

For flutter use,

await GoogleSignIn().signOut();
await _auth.signOut();

Upvotes: 0

Sumanth Hegde
Sumanth Hegde

Reputation: 81

Use same instances of Firebase Auth and GoogleSignInClient,
for example, If we declared and instantiated a Firebase Auth called mAuth in LoginActivity,
Then if we declare a new mAuth in other activity and try to call mAuth.login, it will not work properly.
Make Firebase Auth and GoogleSignInClient variables public and static and use the same from the other activities

Upvotes: 1

bastami82
bastami82

Reputation: 6153

None of the above did fix the issue for me,

  1. accepted answer requires access to mGoogleApiClient defined in login view (normally log out button is in settings view)

  2. another answer was suggesting to logout in the login view (after successful login and just before launching to the main view). This was addressing the mGoogleApiClient accessibility issue, but the issue with this approach is every time user opens the app it ends up in login view and requires to log in every time which is not ideal.

So here is what I ended up doing and it is kind of all-round fix that support all the third-party log out options (in my case Facebook and 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 
    }

Upvotes: 2

Sharp
Sharp

Reputation: 1399

I was confused since all of the solutions required having a reference to the GoogleSignInClient, but it is actually not required for you to hold a reference to it, you can simply create a new instance and call signOut() on it.

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

Upvotes: 16

Shib
Shib

Reputation: 76

you can set a custom parameter for the GoogleAuthProvider to force user to re authenticate via google.

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

Upvotes: 1

Bob Snyder
Bob Snyder

Reputation: 38289

In the Firebase Auth Quickstart sample code, the sign-out for Google provider includes these steps. Are you calling GoogleSignInClient.signOut() when you sign-out?

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

Upvotes: 66

Ankit Saini
Ankit Saini

Reputation: 384

I did mGoogleSignInClient.signOut() this is working as expected.

Upvotes: 1

Sumer Singh
Sumer Singh

Reputation: 513

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

this code is written to work as copy past just read COMMENTS in code to customize it to ur needs, i prefer to send user to login

Upvotes: 1

Vidur Chanana
Vidur Chanana

Reputation: 41

You can also define something like this:

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

Upvotes: 4

ZooS
ZooS

Reputation: 688

Another option is to use the FirebaseUI library. It simplifies sign in and sign out operations in a sense that it will do all the heavy lifting for you.

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

          }
      });

Hope this helps

Upvotes: 18

Alex Barbu
Alex Barbu

Reputation: 41

For anyone else who wants this result (as in getting the google account options back) on a different activity.

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

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

Add this on the sign in page, and before you pass to the next activity, just call SignOut().

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

and then, in your other class you can call

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

It's easy, and it will work. Cheers!

Upvotes: 4

Related Questions