База данных Firebase в реальном времени не может соответствовать uid при аутентификации в Play Games - PullRequest
0 голосов
/ 17 марта 2019

Я использую базу данных, которая хранит данные по следующей схеме:

root:
   currentTime
   users:
      <some user id>:
         <value1>
         <value2>
      <some other id>:
         <value1>
         <value2>

Я хочу, чтобы каждый пользователь мог редактировать только значения в соответствующей папке user_id. Мои правила настроены следующим образом:

{
  "rules": {
    "currentTime": {
      ".read" : "auth != null",
      ".write" : "auth != null",
      ".validate" : "newData.isNumber() && newData.val() > 0"
    },
    "users": {
      "$u_id": {
        ".read": "auth != null && $u_id === auth.uid",
        ".write": "auth != null && $u_id === auth.uid"
      }
    }
  }
}

Любой запрос пользователя на чтение или запись получает отказ в разрешении, но если я уберу условие «$ u_id === auth.uid», все это будет работать. Пользователь записывает значения в свою папку user_id, которую я проверил вручную, и это то же самое, что и uid на вкладке пользователей firebase, поэтому я не понимаю, почему оно не выполнит условие. Если это поможет, это код, который я использую для подключения к базе данных:

LD.LogMessage("Connecting to database");
    authCode = PlayGamesPlatform.Instance.GetServerAuthCode();
    Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
    Firebase.Auth.Credential credential =
        Firebase.Auth.PlayGamesAuthProvider.GetCredential(authCode);
    auth.SignInWithCredentialAsync(credential).ContinueWith(task => {
        if (task.IsCanceled) {
            Debug.LogError("SignInWithCredentialAsync was canceled.");
            return;
        }
        if (task.IsFaulted) {
            Debug.LogError("SignInWithCredentialAsync encountered an error: " + task.Exception);
            return;
        }

        Firebase.Auth.FirebaseUser newUser = task.Result;
        Debug.LogFormat("User signed in successfully: {0} ({1})",
            newUser.DisplayName, newUser.UserId);
        reference = FirebaseDatabase.DefaultInstance.RootReference;
        userId = newUser.UserId;
        LD.LogMessage("Successfully connected");
        LD.canLoad = true;
    });
...