Правила базы данных Firebase в реальном времени не работают после проверки подлинности и отправки данных

# #android #firebase #unity3d #firebase-realtime-database

Вопрос:

В настоящее время я нахожусь в процессе запуска своего проекта с Firebase. Я завершил аутентификацию с помощью этого скрипта здесь.

 using System.Collections.Generic;
using UnityEngine;
using GooglePlayGames;
using GooglePlayGames.BasicApi;
using UnityEngine.SocialPlatforms;
using System.Threading.Tasks;
using Firebase;
using Firebase.Auth;

public class FirebaseManager : MonoBehaviour
{

    private string AuthCode;

    private void Start()
    {
        // Initialize Play Games Configuration and Activate it. 
        PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder()
            .RequestServerAuthCode(false)
            .Build();
        Debug.LogWarning("Config Built");
        PlayGamesPlatform.InitializeInstance(config); Debug.LogWarning("Instance");
        PlayGamesPlatform.Activate(); Debug.LogWarning("Activate");

        Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance; // Sign In and Get a server auth code. 
        UnityEngine.Social.localUser.Authenticate((bool success) =>
        {
            if (!success)
            {
                Debug.LogError("SignInOnClick: Failed to Sign into Play Games Services.");
                return;
            }
            string authCode = PlayGamesPlatform.Instance.GetServerAuthCode();
            if (string.IsNullOrEmpty(authCode))
            {
                Debug.LogError("SignInOnClick: Signed into Play Games Services but failed to get the server auth code.");
                return;
            }
            Debug.LogFormat("SignInOnClick: Auth code is: {0}", authCode); // Use Server Auth Code to make a credential 

            Firebase.Auth.Credential credential = Firebase.Auth.PlayGamesAuthProvider.GetCredential(authCode); // Sign In to Firebase with the credential
            auth.SignInWithCredentialAsync(credential).ContinueWith(task => {
                if (task.IsCanceled)
                {
                    Debug.LogError("SignInOnClick was canceled.");
                    return;
                }
                if (task.IsFaulted)
                {
                    Debug.LogError("SignInOnClick encountered an error: "   task.Exception);
                    return;
                }
                Firebase.Auth.FirebaseUser newUser = task.Resu<
                Debug.LogFormat("SignInOnClick: User signed in successfully: {0} ({1})", newUser.DisplayName, newUser.UserId);
            });
        });
    }
}
 

Как только я создам этот проект в Google Play и протестирую его, появится всплывающее окно пользовательского интерфейса Google, в котором отображается имя моей учетной записи Google Play. Проверяя панель аутентификации firebase, я вижу, что моя учетная запись Google Play заполняет поле идентификатором UID.

Я отправляю некоторые данные в свою базу данных через REST API

 using System.Collections.Generic;
using UnityEngine;
using Firebase.Database;
using Proyecto26;
using Firebase;
using Firebase.Auth;
using UnityEngine.UI;
using TMPro;

public class Database : MonoBehaviour
{
    #region Instance
    public static Database I;
    public void GetInstance()
    {
        if(I == null)
        {
            I = this;
        }
        else
        {
            Destroy(I);
            I = this;
        }
    }
    private void Awake()
    {
        GetInstance();
    }
    #endregion

    private string UID;
    PlayerSaveData playerSaveData = new PlayerSaveData();

    private void Start()
    {
        Debug.Log("Sending data");
        LoadedData();
    }

    public void SavePlayerData() 
    {
        UserID();
        Debug.Log(UID);

        RestClient.Put("https://-censored project linkrtdb.firebaseio.com/users"   UID   ".json", playerSaveData);

        Debug.Log("Sent Data function complete");
    }
    public void LoadedData()
    {
        RestClient.Get<PlayerSaveData>("https://-censored project link-rtdb.firebaseio.com/users"   UID   ".json").Then(response =>
        {
            playerSaveData = response;
        });
    }
    // UID //

    public void UserID()
    {
        Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
        Firebase.Auth.FirebaseUser user = auth.CurrentUser;

        if (user != null)
        {
            string playerName = user.DisplayName;

            // The user's Id, unique to the Firebase project.
            // Do NOT use this value to authenticate with your backend server, if you
            // have one; use User.TokenAsync() instead.
            string uid = user.UserId;

            Debug.LogWarning("Player UID: "   uid);
            UID = uid;
        }
        else
        {
            UID = "No UID";
        }
    }
}
 

Как только я проверяю свои данные на странице базы данных на консоли Firebase в режиме реального времени через Google Play Market, данные заполняются только тогда, когда я устанавливаю правила для проверки «Запись = истина и чтение = истина для всех».

Однако, как только я добавлю правила из документов, которые соответствуют моей ситуации

 {
  "rules": {
    "users": {
      "$uid": {
        // Allow only authenticated content owners access to their data
        ".read": "auth != null amp;amp; auth.uid == $uid",
        ".write": "auth != null amp;amp; auth.uid == $uid"
      }
    }
  }
}  
 

Живое приложение не продолжает запись в базу данных.

Мой журнал отладки в Logcat показывает, что UID выдает тот же самый точный UID, который аутентифицирован на firebase.

Я ненавижу быть парнем, который наводняет форум вопросом, который, я уверен, задавали 100 раз. Я был на этой огневой базе около 2 дней, но я бросаю полотенце на этом. Я не могу найти ничего уникального для моей ситуации. С теми небольшими знаниями, которыми я обладаю, я чувствую, что каким-то образом аутентификация не соответствует тому, как я структурировал свою базу данных.cs с REST. Но меня заверили, что именно так я и должен поступить.

Любая помощь будет очень признательна, большое спасибо тем, кто нашел время! 😀

Ответ №1:

Похоже, что ваш клиент REST не передает учетные данные пользователя вместе с запросом. Пакет Firebase SDK передает эту информацию при каждом подключении/запросе, и вам придется сделать то же самое здесь.

Ознакомьтесь с документацией Firebase по авторизации запросов REST, в частности с разделом об аутентификации с помощью токена идентификатора, что, вероятно, проще всего для вас.

С другой стороны, я бы рекомендовал взглянуть на использование Firebase Realtime Database SDK вместо вызова REST API, так как это автоматически передаст необходимую информацию.

Комментарии:

1. Спасибо! Я внес некоторые коррективы в свой код и завтра протестирую его в Google Play. Я был заинтересован в использовании SDK базы данных. Но не удалось найти эффективный способ передачи одного сохраненного сценария данных. Если это вообще возможно, я хотел бы знать, как это сделать.

2. «не удалось найти эффективный способ передачи одного сценария сохраненных данных» Я не уверен, что это значит, но в любом случае: если вы используете REST API, вам придется передать маркер идентификатора, как указано в документах, которые я связал. Если вы используете SDK базы данных реального времени, это не требуется.