You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 03:40:27