# #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 базы данных реального времени, это не требуется.