React Native中Firebase实时数据库读写权限被拒问题排查
React Native集成Firebase实时数据库与Google认证后权限被拒问题
我在React Native项目中集成了Firebase实时数据库与Google认证功能,登录Google账号后尝试对数据库执行读写操作时,始终收到权限被拒的错误。已检查Google认证代码与数据库写入代码,但无法定位问题根源,怀疑是认证流程或Firebase配置存在异常。相关代码与Firebase规则如下:
Google认证代码
function onAuthStateChanged(user) { setUser(user); if (initializing) setInitializing(false); } useEffect(() => { const subscriber = auth().onAuthStateChanged(onAuthStateChanged); return subscriber; // unsubscribe on unmount }, []); const onGoogleButtonPress = async () => { // Check if your device supports Google Play await GoogleSignin.hasPlayServices({ showPlayServicesUpdateDialog: true }); // Get the users ID token const { idToken } = await GoogleSignin.signIn(); // Create a Google credential with the token const googleCredential = auth.GoogleAuthProvider.credential(idToken); // Sign-in the user with the credential const user_sign_in = auth().signInWithCredential(googleCredential); user_sign_in.then((user) => { console.log(user); }).catch((error) => { console.log(error); }) }
数据库写入代码
const writeDataToDatabase = (data) => { if (user) { console.log(user.idToken); set(ref(db, user.uid), data) .then(() => { console.log('Successful'); }) .catch((error) => { console.error('Error: ', error); }); } };
Firebase规则
"rules": { ".read": "auth != null", ".write": "auth != null",
排查与解决方案
修正Firebase规则语法
你提供的规则存在语法错误,缺少闭合的}和外层对象包裹,正确的规则应该是:{ "rules": { ".read": "auth != null", ".write": "auth != null" } }语法错误会导致规则无法正常解析,数据库会默认拒绝所有请求。
确认认证状态同步
在writeDataToDatabase函数中,直接使用Firebase Auth的当前用户对象,避免组件状态更新滞后导致的过期用户信息:const writeDataToDatabase = (data) => { const currentUser = auth().currentUser; if (currentUser) { set(ref(db, currentUser.uid), data) .then(() => console.log('Successful')) .catch((error) => console.error('Error: ', error)); } };验证ID Token有效性
调用getIdTokenResult()检查token是否有效且包含正确的认证信息:const writeDataToDatabase = async (data) => { const currentUser = auth().currentUser; if (currentUser) { try { const tokenResult = await currentUser.getIdTokenResult(); console.log('Token claims:', tokenResult.claims); await set(ref(db, currentUser.uid), data); console.log('Successful'); } catch (error) { console.error('Error: ', error); } } };如果token过期或无有效认证信息,需重新触发认证流程。
检查Firebase初始化配置
确认项目中Firebase初始化的firebaseConfig包含正确的databaseURL,且与Firebase控制台中的数据库实例一致,避免连接到错误的数据库。测试临时放宽规则(仅限测试环境)
临时将规则改为:{ "rules": { ".read": true, ".write": true } }如果此时能正常读写,说明问题出在认证与规则的关联上,需重新检查Google认证的配置(如Firebase控制台是否启用Google登录、客户端ID是否匹配)。测试完成后务必改回安全规则。
内容的提问来源于stack exchange,提问作者Crane Bilious
相关产品推荐
相关产品推荐

