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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:15:28