React Native Expo中Firebase Auth状态不持久化问题求助
认证状态无法持久化问题(React Native + Expo + Firebase + RTK)
技术栈与代码实现
使用React Native + Expo CLI + Redux Toolkit开发,Firebase版本为9.15.0,相关代码如下:
登录RTK Mutation
export const loginWithEmail = (builder: Builder) => builder.mutation<Payload | unknown | undefined, Params>({ queryFn: async ({ email, password }) => { try { const { user } = await signInWithEmailAndPassword( auth, email, password ); return { data: { uid: user.uid, email: user.email, emailVerified: user.emailVerified, }, }; } catch (error) { const authError = error as AuthError; return { error: { ...authError }, }; } }, });
认证状态监听
onAuthStateChanged(auth, (user) => { console.log("current-user: ", user); // 刷新应用时为null if (user) { dispatch(setUser({ currentUser: user })); } });
Firebase配置
import { FIREBASE_API_KEY, FIREBASE_AUTH_DOMAIN, FIREBASE_PROJECT_ID, FIREBASE_STORAGE_BUCKET, FIREBASE_MESSAGING_SENDER_ID, FIREBASE_APP_ID, FIREBASE_MEASUREMENT_ID, } from "@env"; const firebaseConfig = { apiKey: FIREBASE_API_KEY, authDomain: FIREBASE_AUTH_DOMAIN, projectId: FIREBASE_PROJECT_ID, storageBucket: FIREBASE_STORAGE_BUCKET, messagingSenderId: FIREBASE_MESSAGING_SENDER_ID, appId: FIREBASE_APP_ID, measurementId: FIREBASE_MEASUREMENT_ID, }; // Initialize Firebase const app = getApps().length < 1 ? initializeApp(firebaseConfig) : getApp(); const analytics = getAnalytics(app); const db = getFirestore(app); const auth = getAuth(app);
问题现象
登录成功后认证状态无法持久化,刷新应用时onAuthStateChanged回调返回的user为null。通过JS调试器检查发现,登录后未生成cookies、session storage或IndexedDB,这是状态无法持久化的核心原因。
解决方案
1. 配置Firebase Auth持久化策略
React Native环境下,Firebase Auth不会默认启用持久化,需要手动配置使用AsyncStorage存储会话:
// 替换原有auth初始化代码 import { initializeAuth, getReactNativePersistence } from 'firebase/auth'; import AsyncStorage from '@react-native-async-storage/async-storage'; const auth = initializeAuth(app, { persistence: getReactNativePersistence(AsyncStorage) });
执行expo install @react-native-async-storage/async-storage安装依赖包。
2. 确保初始化与监听时机正确
将Firebase配置代码放在应用启动的入口文件(如App.js)顶部,保证onAuthStateChanged监听在Auth实例初始化后立即注册,避免延迟执行导致无法捕获初始会话状态。
3. 排查登录流程异常
登录成功后,手动打印auth.currentUser确认用户状态;检查代码中是否存在意外调用signOut或清除AsyncStorage的逻辑,避免覆盖或删除认证会话。
4. 验证配置与网络
确认.env中的Firebase参数无拼写错误;保证设备网络正常,Firebase Auth需要网络连接完成会话验证。
内容的提问来源于stack exchange,提问作者Kevin Bryan
相关产品推荐
相关产品推荐

