Firebase Google Auth 登出后再登录默认使用上次账号,如何弹出账号选择弹窗?
解决方案
问题根因
你当前仅调用了FirebaseAuth.getInstance().signOut(),这步仅清除了Firebase侧的登录状态,没有清除Google Sign-In SDK在本地缓存的账号授权凭据,因此下次发起登录请求时,Google登录服务会直接复用缓存的最近登录账号,自动跳过账号选择步骤。
修复步骤
1. 补全登出逻辑,同步清除Google侧缓存
在放置登出按钮的独立Activity中,先构建和登录页完全一致的GoogleSignInOptions配置,再依次执行Firebase和Google Sign-In的登出操作,全部完成后再跳转登录页:
// 此处配置必须和登录页的GoogleSignInOptions配置完全相同 GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken(getString(R.string.default_web_client_id)) .requestEmail() .build(); GoogleSignInClient googleSignInClient = GoogleSignIn.getClient(this, gso); // 清除Firebase登录状态 FirebaseAuth.getInstance().signOut(); // 清除Google Sign-In本地缓存的账号信息 googleSignInClient.signOut() .addOnCompleteListener(this, task -> { // 登出全部完成后再跳转登录页,同时清空Activity栈避免回退问题 Intent intent = new Intent(CurrentActivity.this, LoginActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); finish(); });
如果需要彻底清除当前账号对应的授权记录(下次登录时需要重新同意授权),可以在signOut完成后额外调用googleSignInClient.revokeAccess()方法。
2. 登录页强制唤起账号选择框(可选)
如果需要每次发起登录都强制弹出账号选择列表,可以在登录页拉起Google登录的Intent时增加额外配置:
Intent signInIntent = googleSignInClient.getSignInIntent(); // 强制唤起账号选择对话框,忽略本地缓存的账号 signInIntent.putExtra("com.google.android.gms.common.account.EXTRA_ACCOUNT_NAME", (String) null); startActivityForResult(signInIntent, RC_SIGN_IN);
注意事项
- 必须等Google Sign-In的
signOut异步回调完成后再跳转登录页,提前跳转可能会因为缓存未清理完成导致配置不生效 - 登出页和登录页使用的
GoogleSignInOptions配置必须完全一致,否则会出现登出无效的问题
内容的提问来源于stack exchange,提问作者dvirb
相关产品推荐
相关产品推荐

