React Native接入Firebase Auth是否需要用Async Storage存储用户鉴权数据
React Native Firebase Auth 内置持久化使用方案
核心结论
@react-native-firebase/auth 模块本身默认自带登录态持久化能力,底层由Firebase原生SDK实现,iOS端通过系统Keychain存储加密登录信息,Android端通过加密SharedPreferences存储,不需要你手动依赖Async Storage存储token、登录标识等信息。
你目前遇到的重启应用需要重新登录的问题,90%以上的概率是没有正确监听Firebase Auth的初始化状态回调,而非没有做持久化。
接入步骤(适配React Native + redux-saga技术栈)
- 先移除你自己写的所有Async Storage存储/读取登录态、token的逻辑,避免和Firebase自带的逻辑冲突。
- 在全局saga中添加Firebase Auth状态监听,所有登录态判断都走该回调的结果,示例代码如下:
import { eventChannel } from 'redux-saga'; import { take, fork, put } from 'redux-saga/effects'; import auth from '@react-native-firebase/auth'; // 替换为你自己的redux action定义 import { loginSuccess, logoutSuccess } from './authSlice'; function* watchAuthStateChange() { // 创建监听auth状态的事件通道 const authChannel = eventChannel(emit => { const unsubscribe = auth().onAuthStateChanged(user => { emit(user); }); // 返回卸载时的取消订阅方法 return unsubscribe; }); while (true) { const currentUser = yield take(authChannel); if (currentUser) { // 回调返回用户对象,说明登录态有效,直接同步到redux即可 yield put(loginSuccess({ userInfo: currentUser })); // 后续需要请求用的token时,直接调用 currentUser.getIdToken() 即可,会自动处理刷新逻辑 } else { // 无有效登录态,同步登出状态,引导用户登录 yield put(logoutSuccess()); } } } // 在你的rootSaga中启动该监听任务 export default function* rootSaga() { yield fork(watchAuthStateChange); // 其他你的saga任务 }
常见踩坑说明
- 不要在应用冷启动时直接读取
auth().currentUser判断登录态:Firebase Auth初始化是异步操作,冷启动时直接读取该属性大概率返回null,必须等onAuthStateChanged的回调结果。 - 不要手动存储、刷新token:Firebase原生SDK会自动处理id token的过期刷新逻辑,你每次需要携带token请求时,直接调用用户对象的
getIdToken()方法就能拿到最新的有效token。 - 如果按照上述逻辑配置后仍然出现登录态丢失,检查你的应用是否有主动调用
auth().signOut()的逻辑、或者清理应用本地缓存的逻辑误删了Firebase的持久化存储内容。
内容的提问来源于stack exchange,提问作者Zenixo
相关产品推荐
相关产品推荐

