Firebase 实时数据库规则被拒绝权限

Posted

技术标签:

【中文标题】Firebase 实时数据库规则被拒绝权限【英文标题】:Firebase Realtime Database Rules Denied Permission 【发布时间】:2021-05-25 03:17:52 【问题描述】:

我正在使用电子邮件/密码登录方法注册用户。所以成功注册登录后,我无法在Firebase Real Time中读写数据。

我是 Firebase 的新手,所以我无法弄清楚主要问题是什么,或者我错过了哪些步骤。

这条规则显然可以正常工作:


       "rules": 
              ".read": "auth == null",
              ".write": "auth == null"
        
   

但是,尽管我的用户已经注册并获得了 UID,但此规则不起作用。


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

它总是显示以下错误:

Exception occured while processing the request.
Url: https://App-Name-6ssd2.firebaseio.com/Appointments/-MUAG-CHWBFSv-Vrtsoc/.json?print=silent

Response: 
  "error" : "Permission denied"


我目前想要的是允许任何注册用户读取/写入每个人的信息,但它总是拒绝该权限。

截图:

我获取 Firebase 数据的实现。 错误也指向this方法。

  public async Task<List<Appointment>> GetUserAppointment(string userId)
        
            var appointments = (await Firebase.Child("Appointments")
              .OnceAsync<Appointment>()).Where(a => a.Object.UID == userId).Select(item =>
              new Appointment
              
                  UID = item.Object.UID,
                  AppointmentID = item.Object.AppointmentID,
                  Title = item.Object.Title,
                  Date = item.Object.Date,
                  Time = item.Object.Time,
                  Status = item.Object.Status,
                  ReasonText = item.Object.ReasonText

              ).ToList();
            return appointments;

我第一次使用 SinUp 时的实现。

 public async Task<string> SignUpWithEmailAndPassword(string email, string password)
        
            try
            
                var signUpTask = await auth.CreateUserWithEmailAndPasswordAsync(email, password);
                var user = signUpTask.User;
                var token = await auth.CurrentUser.GetIdToken(false).AsAsync<GetTokenResult>();

                await SendEmailVerification();

                return token.Token;
            
            catch (FirebaseAuthInvalidUserException e)
            
                e.PrintStackTrace();
                return string.Empty;

            
            catch (FirebaseAuthInvalidCredentialsException e)
            
                e.PrintStackTrace();
                return string.Empty;

            
            catch (FirebaseAuthUserCollisionException existEmail)
            
                existEmail.PrintStackTrace();
                return string.Empty;
            
        

为了检查用户是否经过身份验证/验证,我进行了调试,结果...我可以在控制台中看到与 Firebase -> 身份验证 -> 用户相同的 UID。

这是屏幕截图。

调试GetUserAppointment(string userID)查看当前用户是否设置。

【问题讨论】:

您是否忘记包含产生错误的实际 C# 代码? @FrankvanPuffelen 感谢您的回复。我刚刚添加了 C# 代码。你可以去看看!谢谢 你怎么知道有一个当前登录的用户(这是你的规则正在检查的)? 另外请注意,我怀疑Firebase.Child("Appointments").OnceAsync&lt;Appointment&gt;()).Where(a =&gt; a.Object.UID == userId) 在服务器端执行条件,所以我建议也在这里查看查询:firebase.google.com/docs/database/unity/… @FrankvanPuffelen 我可以通过给出以下代码行来检查用户是否已登录:FirebaseAuth auth = FirebaseAuth.Instance; var userId = auth.Uid; 成功登录后,我可以在控制台中看到与在 Firebase 中完全相同的 UID -> 身份验证 -> 用户。 【参考方案1】:

这是因为您没有获得数据库的授权,请检查实时数据库中的“规则”选项卡。

    打开firebase,选择左侧的数据库。

    现在在右侧,从下拉列表中选择实时数据库并更改规则以允许任何人编写数据库

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

你的规则是:


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

这意味着只有授权用户才能写入和读取数据。

【讨论】:

这正是我想要的。我只想允许授权用户访问 Firebase 数据库,而不是任何人。 @Hashmat 关于LoginWithEmailPassword,可以看看:***.com/questions/49607811/…

以上是关于Firebase 实时数据库规则被拒绝权限的主要内容,如果未能解决你的问题,请参考以下文章

Firebase实时数据库:DatabaseError权限被拒绝

Firebase 实时数据库规则拒绝权限

成功身份验证后,Flutter Firebase 数据库权限被拒绝

如何在firebase实时数据库中编写规则?

Firebase 规则 - 权限被拒绝

Firebase 数据库规则权限被拒绝但模拟工作