如何编写将 Auth.DefaultInstance.CurrentUser UID 与 Firebase 身份验证中的 UID 进行比较的 Firebase 规则

问题描述

如果我为 ".read": true 设置 Firebase 规则,我的应用可以正常运行。如果我只需要一个经过身份验证的用户(见下文),Firebase 会抛出异常“权限被拒绝”我做错了什么?任何帮助将不胜感激。

这是我的规则:

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

LoginPage.xaml.cs

using pelletPirate.Interfaces;
using System;
using System.ComponentModel;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
using pelletPirate.Services;

namespace pelletPirate.Views
{
    [XamlCompilation(XamlCompilationoptions.Compile)]
    [DesignTimeVisible(true)]
    public partial class LoginPage : ContentPage
    {
        FirebaseHelper firebaseHelper = new FirebaseHelper();
        IAuth auth;

        public LoginPage()
        {
            InitializeComponent();
            auth = DependencyService.Get<IAuth>();
        }

        private async void BtnLogin_Clicked(object sender,EventArgs e)
        {
            Email.Text = "connor@connor.com";
            Password.Text = "connor";

            var token = await auth.LoginWithEmailPassword(Email.Text,Password.Text);
            System.Diagnostics.Debug.WriteLine("Logged inToken is: " + token + "******** UID is: " + App.G_currentuser);

            if (token != string.Empty)
            {
                Email.Text = null;
                Password.Text = null;
                var OwnerObject = await firebaseHelper.SetGlobalOwnersController(App.G_currentuser);
                App.G_controller = OwnerObject.controller;
                System.Diagnostics.Debug.WriteLine("Returned back to LoginPage Global Controller set to: [" + App.G_controller + "] <<--- controller should be in the brackets!");
                await Shell.Current.GoToAsync("//loggedin");
            }
            else
            {
                await displayAlert("Authentication Failed","E-mail or password are incorrect. Try again!","OK");
            }
        }
    }
}

AuthIOS.cs

using System;
using System.Threading.Tasks;
using Foundation;
using Firebase.Auth;
using pelletPirate.Interfaces;
using pelletPirate.iOS;
using Xamarin.Forms;

[assembly: Dependency(typeof(AuthIOS))]

namespace pelletPirate.iOS
{
    class AuthIOS : IAuth
    {
        public async Task<string> LoginWithEmailPassword(string email,string password)
        {
            try
            {
                SignOut();
                System.Diagnostics.Debug.WriteLine("In AuthIOS and BEFORE SignIn to Firebase (should be NULL) and Auth.DefaultInstance.CurrentUser is: [" + Auth.DefaultInstance.CurrentUser + "] << inside these brackets!");
                var user = await Auth.DefaultInstance.SignInWithPasswordAsync(email,password);
                App.G_currentuser = user.User.Uid;
                System.Diagnostics.Debug.WriteLine("In AuthIOS AFTER SignIn and Auth.DefaultInstance.CurrentUser is: [" + Auth.DefaultInstance.CurrentUser + "] << inside these brackets!");
                return await user.User.GetIdTokenAsync();
            }
            catch (Exception e)
            {
                System.Diagnostics.Debug.WriteLine("ERROR in login caught -->> " + e + " <<-- error diplay here");
                return "";
            }
        }

        public bool SignOut()
        {
            try
            {
                _ = Auth.DefaultInstance.SignOut(out NSError error);
                return error == null;
            }
            catch (Exception e) { System.Diagnostics.Debug.WriteLine("AuthIOS SignOut Failed " + e); }
            {
                return false;
            }
        }

        public bool IsSignedIn()
        {
            var user = Auth.DefaultInstance.CurrentUser;
            return user != null;
        }
    }

}

FirebaseHelper.cs(服务)

using Firebase.Database;
using pelletPirate.Models;
using System.Linq;
using System.Threading.Tasks;

namespace pelletPirate.Services
{
    public class FirebaseHelper
    {
        FirebaseClient firebase = new FirebaseClient("https://pelletpirate-auth-default-rtdb.firebaseio.com/");

        public async Task<Owner> SetGlobalOwnersController(string userid) // used to get the Controller name and return it to be assigned to a global variable
        {
            return (await firebase.Child("owners").OnceAsync<Owner>()).Select(item => new Owner
            {
                userId = userid,controller = item.Object.controller,}).FirstOrDefault();
        }
 
    }
}

任何帮助或检查的想法将不胜感激。我整个星期都在为此苦苦挣扎,似乎无法取得突破。谢谢,布赖恩

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)