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

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", 

排查与解决方案

  1. 修正Firebase规则语法
    你提供的规则存在语法错误,缺少闭合的}和外层对象包裹,正确的规则应该是:

    {
      "rules": {
        ".read": "auth != null",
        ".write": "auth != null"
      }
    }
    

    语法错误会导致规则无法正常解析,数据库会默认拒绝所有请求。

  2. 确认认证状态同步
    在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));
        }
    };
    
  3. 验证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过期或无有效认证信息,需重新触发认证流程。

  4. 检查Firebase初始化配置
    确认项目中Firebase初始化的firebaseConfig包含正确的databaseURL,且与Firebase控制台中的数据库实例一致,避免连接到错误的数据库。

  5. 测试临时放宽规则(仅限测试环境)
    临时将规则改为:

    {
      "rules": {
        ".read": true,
        ".write": true
      }
    }
    

    如果此时能正常读写,说明问题出在认证与规则的关联上,需重新检查Google认证的配置(如Firebase控制台是否启用Google登录、客户端ID是否匹配)。测试完成后务必改回安全规则。


内容的提问来源于stack exchange,提问作者Crane Bilious

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 06:25:08