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
相关产品推荐
相关产品推荐

