.NET MAUI中Firebase实时数据库仅注册用户读写规则配置问题
问题核心与解决方案
你现在把用户UID当成认证Token传给Firebase实时数据库,但Firebase要求的是Firebase ID Token(不是用户UID),这就是收到权限拒绝的根本原因。以下是具体修复步骤:
1. 修正登录时的Token保存逻辑
登录代码中你已经获取了auth.FirebaseToken(注意你变量名拼写成了aurhToken,建议修正拼写避免混淆),需要把这个Firebase ID Token保存到偏好设置,而不是用户UID:
var user_email = Mail.Trim(); var user_password = Password; var authProvider = new FirebaseAuthProvider(new FirebaseConfig(Literals.FirebaseStringProvider)); var auth = await authProvider.SignInWithEmailAndPasswordAsync(user_email, user_password); var isValid = auth.User.IsEmailVerified; string idUser = auth.User.LocalId; string authToken = auth.FirebaseToken; // 修正变量名拼写 string refreshToken = auth.RefreshToken; if (isValid) { Preferences.Set("RefreshToken", refreshToken); Preferences.Set("IdUser", idUser); Preferences.Set("FirebaseIdToken", authToken); // 保存Firebase ID Token // 其他偏好设置项不变 }
2. 修正数据库初始化代码
读取保存的Firebase ID Token,而非用户UID:
// 读取Firebase ID Token,不是用户UID string token = Preferences.Get("FirebaseIdToken", ""); FirebaseClient fb = new FirebaseClient("https://你的数据库地址/", new FirebaseOptions { AuthTokenAsyncFactory = () => Task.FromResult(token) }); IdProductos = new List<string>(); var getListUsers = await fb .Child("Products") .OrderByKey() .LimitToFirst(10) .OnceAsync<IdProductos>();
3. 设置正确的实时数据库规则
场景1:允许所有已认证用户读写整个数据库
{ "rules": { ".read": "auth != null", ".write": "auth != null" } }
场景2:更严格的权限控制(仅允许用户读写自己的专属节点)
如果需要限制用户只能访问自己的数据,同时开放Products节点给所有已认证用户:
{ "rules": { "users": { "$uid": { ".read": "auth.uid == $uid", ".write": "auth.uid == $uid" } }, "Products": { ".read": "auth != null", ".write": "auth != null" } } }
4. 处理Token过期问题
Firebase ID Token默认1小时后过期,遇到权限拒绝时,需用RefreshToken刷新获取新的ID Token:
var authProvider = new FirebaseAuthProvider(new FirebaseConfig(Literals.FirebaseStringProvider)); string refreshToken = Preferences.Get("RefreshToken", ""); var refreshedAuth = await authProvider.RefreshAuthAsync(refreshToken); // 更新保存的Token Preferences.Set("FirebaseIdToken", refreshedAuth.FirebaseToken); Preferences.Set("RefreshToken", refreshedAuth.RefreshToken);
内容的提问来源于stack exchange,提问作者Ariel Saldaña
相关产品推荐
相关产品推荐

