升级Firebase Android至15.0.0版本后已登录用户被登出问题咨询
我之前在项目升级Firebase Auth版本时也碰到过一模一样的问题,这其实是跨大版本升级时的兼容性问题,下面给你梳理下原因和解决办法:
问题原因
从Firebase Auth 11.8.0升级到15.0.0版本时,Auth模块对用户身份令牌的存储格式、解析逻辑做了底层调整,旧版本(11.8.0)持久化存储的用户令牌无法被新版本(15.0.0)正确识别,导致FirebaseAuth.getInstance().getCurrentUser()直接返回null,触发用户登出的现象,而且这个问题在Phone Auth和Email/Password Auth场景下都会出现。
解决方案
针对这个问题,你可以通过以下几种方式处理:
1. 手动处理令牌刷新与迁移
如果你的APP之前有持久化保存用户的refresh token(比如存在SharedPreferences中),可以在APP启动时尝试用旧的refresh token重新获取用户凭据,完成自动登录:
FirebaseAuth mAuth = FirebaseAuth.getInstance(); mAuth.addAuthStateListener(new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { FirebaseUser currentUser = firebaseAuth.getCurrentUser(); if (currentUser == null) { // 从本地存储中读取旧版本保存的refresh token SharedPreferences prefs = getSharedPreferences("AppPrefs", MODE_PRIVATE); String oldRefreshToken = prefs.getString("user_refresh_token", null); if (oldRefreshToken != null) { // 使用旧refresh token尝试重新登录 mAuth.signInWithRefreshToken(oldRefreshToken) .addOnCompleteListener(task -> { if (task.isSuccessful()) { FirebaseUser updatedUser = task.getResult().getUser(); // 保存新版本的refresh token,覆盖旧的 prefs.edit() .putString("user_refresh_token", updatedUser.getRefreshToken()) .apply(); } else { // 刷新失败,引导用户手动重新登录 navigateToLoginPage(); } }); } else { // 没有旧的refresh token,只能引导用户重新登录 navigateToLoginPage(); } } } });
2. 确认持久化配置正确
虽然Firebase Auth默认启用持久化,但升级后可能需要明确配置确保生效,注意要在任何Auth操作之前调用:
// 在APP初始化时设置 FirebaseAuth.getInstance().setPersistenceEnabled(true);
3. 给用户添加过渡提示
如果你的用户群体较大,可以在APP升级后的首次启动时,弹出友好提示告知用户“因版本升级需要重新登录一次”,避免用户产生困惑。同时可以在后台统计这类情况,确保大部分用户能顺利完成过渡。
内容的提问来源于stack exchange,提问作者Abdul Wasae
相关产品推荐
相关产品推荐

