微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何编写将 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 举报,一经查实,本站将立刻删除。