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

Firebase Realtime Database认证后规则失效,数据无法写入问题求助

问题根因

你的判断完全正确:Firebase Auth登录仅在Firebase官方SDK内部维护了用户认证状态,你使用第三方RestClient发起REST请求时,没有携带当前用户的有效ID Token,因此Firebase Realtime Database的规则无法识别请求身份,直接拒绝了读写操作。
规则中的auth对象并不是根据你请求路径里的UID识别的,必须通过请求携带的ID Token解析出用户信息,才能完成auth.uid == $uid的校验。

修复步骤

1. 新增获取用户ID Token的方法

Firebase Auth会自动维护ID Token的有效期和刷新逻辑,直接调用TokenAsync即可获取当前有效Token:

using System.Threading.Tasks;

// 放到Database类中
private async Task<string> GetValidIdToken()
{
    var currentUser = FirebaseAuth.DefaultInstance.CurrentUser;
    if (currentUser == null) return null;
    // 参数false表示不强制刷新,SDK会自动处理过期刷新逻辑
    return await currentUser.TokenAsync(false);
}

2. 修正REST请求逻辑

你原有代码还存在路径拼接错误:users和UID之间缺少斜杠,会导致请求路径错误。同时需要把获取到的ID Token作为auth参数附加到请求URL末尾:

public async void SavePlayerData() 
{
    UserID();
    if (UID == "No UID")
    {
        Debug.LogError("用户未登录,无法保存数据");
        return;
    }
    var idToken = await GetValidIdToken();
    if (string.IsNullOrEmpty(idToken))
    {
        Debug.LogError("获取认证Token失败");
        return;
    }
    // 修正路径拼接,补充斜杠,附加auth参数
    string requestUrl = $"https://你的数据库地址/users/{UID}.json?auth={idToken}";
    RestClient.Put(requestUrl, playerSaveData);
    Debug.Log("数据保存请求已发送");
}

public async void LoadedData()
{
    UserID();
    if (UID == "No UID") return;
    var idToken = await GetValidIdToken();
    if (string.IsNullOrEmpty(idToken)) return;
    string requestUrl = $"https://你的数据库地址/users/{UID}.json?auth={idToken}";
    RestClient.Get<PlayerSaveData>(requestUrl).Then(response =>
    {
        playerSaveData = response;
    });
}

注意事项

  • ID Token默认有效期1小时,不要长期缓存,每次发起请求前调用TokenAsync获取即可,SDK会自动复用未过期的Token,过期时自动刷新
  • 你原有安全规则无需修改,只要请求携带正确的ID Token即可通过校验

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 20:12:02