React Native中Firebase Google登录后Firestore报permission-denied如何解决
修复方案
你给出的Firestore规则本身语法正确,request.auth != null的判断逻辑没有问题,可按以下步骤排查修复:
- 排查Auth状态与Firestore调用的时序问题
绝大多数该类报错都是因为登录逻辑还未执行完成、Auth状态还未同步到Firebase SDK全局时,就提前触发了Firestore读写操作。可以在调用Firestore的代码前加登录态校验,确保操作执行时登录态已就绪:import auth from '@react-native-firebase/auth'; import firestore from '@react-native-firebase/firestore'; // 封装安全的Firestore操作,确保执行前已登录 const getCurrentUserDoc = async () => { const currentUser = auth().currentUser; // 无当前登录用户时,等待auth状态变更回调 if (!currentUser) { return new Promise((resolve, reject) => { const unsubscribe = auth().onAuthStateChanged(user => { unsubscribe(); if (user) { resolve(firestore().collection('users').doc(user.uid).get()); } else { reject(new Error('用户未登录')); } }); }); } // 已有登录态直接执行操作 return firestore().collection('users').doc(currentUser.uid).get(); }; - 检查本地Firebase模拟器的联动配置
如果使用本地模拟器测试,必须同时开启Auth模拟器和Firestore模拟器,且Google登录逻辑要对接本地Auth模拟器,否则线上生成的登录凭据无法被本地Firestore模拟器识别,会直接判定request.auth为null:// 项目初始化阶段同时配置两个模拟器 auth().useEmulator('http://localhost:9099'); firestore().useEmulator('localhost', 8080); - 确认规则覆盖范围
检查你当前报错的Firestore操作确实是访问/users集合下的资源,如果你还访问了其他未配置规则的集合,Firestore默认会触发全局拒绝逻辑,报错信息和当前报错完全一致,容易混淆。 - 升级React Native Firebase依赖
v12以下的部分React Native Firebase版本存在Auth状态同步到Firestore模块延迟的已知bug,将@react-native-firebase/app、@react-native-firebase/auth、@react-native-firebase/firestore三个依赖升级到最新稳定版即可修复该类同步问题。 - 验证Google登录流程正确性
确认Google登录返回的ID Token、Access Token没有过期,且调用signInWithCredential方法时没有抛出异常,登录成功后auth().currentUser可以正常打印出完整的用户信息。
内容的提问来源于stack exchange,提问作者amk
相关产品推荐
相关产品推荐

