Состояние гонки аутентификации заставляет новых пользователей отключать правила безопасности - PullRequest
0 голосов
/ 31 октября 2019

Среда: Firebase Unity 6.6.0, Unity Editor 2019.2.8f1

Я вижу ошибку "Этот клиент не имеет разрешения на выполнение этой операции." для новых анонимных пользователейкто аутентифицировал моменты раньше. Если я подожду 5-30 секунд и снова подключусь к тому же пользователю, проблема не появится.

Мои соответствующие правила безопасности базы данных реального времени

{
  "rules": {   
    "gameSettings":{
      ".read": true,
      ".write": false
    },
    "userCompletedMissions": {
      ".write": false,
        "$uid": {
        ".read": "$uid === auth.uid",
        }
    },
    "userRanks": {
      ".write": false,
      ".read": "auth != null",
      "english": {
        ".indexOn": ["rankOrderKey", "dRankOrderKey", "wRankOrderKey", "mRankOrderKey"], 
        },
      "spanish": {
        ".indexOn": ["rankOrderKey", "dRankOrderKey", "wRankOrderKey", "mRankOrderKey"], 
        }
    }
  }
}

Мой проект Firebase является мобильнымигра. Игроки впервые создают учетную запись Anonymous FirebaseUser с await auth.SignInAnonymouslyAsync(); и сразу же прослушивают данные. Все, что требует ".read": true, работает безупречно, но все, что связано с ".read": "auth != null" и ".read": "$uid === auth.uid", отключает мои правила безопасности и выдает ошибку "Этот клиент не имеет разрешения на выполнение этой операции."

Например: FirebaseDatabase.DefaultInstance.GetReference("userRanks/english/SOME_USER_ID").ValueChanged += SomeFunction(...);

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


Редактировать: дополнительная информация

Что мне показалось интересным, так это журналы, полученные после следующих действий по воспроизведению: 1. МойВ Unity Game был аутентифицированный пользователь Firebase «Semadikp6FheE1FZMqi7MnCy0Iv2» в редакторе Unity на рабочем столе Mac OS 2. В консоли Firebase я перешел на вкладку «Аутентификация», нашел пользователя «Semadikp6FheE1FZMqi7MnCy0Iv2» и3. В следующий раз, когда я запустил свой Unity Editor, все ошибки «Этот клиент не имеет разрешения на выполнение этой операции» ссылались на удаленного пользователя «Semadikp6FheE1FZMqi7MnCy0Iv2» logs 4. Моя игра Unity допускает ошибки времени выполнения, перезагружая игровую сцену(Unity Editor Play Mode не останавливается). Когда сцена перезагружалась, она снова инициализировала все с нуля, включая вызовы Firebase API. Пользователь Firebase, на который он ссылался в этой попытке, был новым пользователем Firebase "UTc2NqwgYPTUFnnDCGSTLQm0yv63". Все работало гладко.

Это похоже на ошибку, связанную с кэшированием, либо в клиенте Unity Firebase, либо в службе Firebase.

Дополнительное объяснение: я неоднократно удалял учетную запись Anonymous, подключенную к моему устройству Unity Editor, в попытке воспроизвести ошибку, мешающую моему товарищу по команде запустить игру. Всякий раз, когда он запускает игру в редакторе Unity, он получает ошибки «Этот клиент не имеет разрешения на выполнение этой операции», которые не устраняются при последующих попытках. Он присоединился к этому проекту пару недель назад, и проекту уже 11 месяцев. Скорее всего, это невинная проблема, такая как «файл отсутствует» из проверки GIT. К сожалению, я не нашел никаких очевидных ошибок с моей стороны, и проблема остается нерешенной. Пожалуйста, порекомендуйте.

1 Ответ

0 голосов
/ 01 ноября 2019

Не похоже, что это проблема, основанная на этом вопросе, но самое простое предложение, которое у меня есть, - убедиться, что у вас включена анонимная аутентификация: Enabling anonymous authentication

ДалееВы можете проверить, аутентифицирован ли пользователь в данный момент, проверив:

FirebaseAuth.DefaultInstance.CurrentUser != null;

. Если хотите, вы также можете проверить IsAnonymous в CurrentUser. Мне нравится проверять это в обработчике прослушивателя StateChanged для глобального сигнала "пользователь вошел в систему".

Со всем этим сказано, так как вы используете await,Вы всегда можете сказать:

FirebaseUser user = FirebaseAuth.DefaultInstance.SignInAnonymouslyAsync();
if (user != null) {}

или в сопрограмме (мой любимый при работе с Unity):

Task<FirebaseUser> signInTask = FirebaseAuth.DefaultInstance.SignInAnonymouslyAsync();
yield return new WaitUntil(() => signInTask.IsComplete);
FirebaseUser user = signInTask.Result;
if (user != null) {}

Наконец, я заметил, что вы используете Firebase 6.4.0 скореечем 6.6.0 ( текущая последняя ). В какой-то момент возникла проблема с выходом FirebaseAuth.DefaultInstance из области видимости, если вы его не держали (то есть, если GC решил выполнить после того, как вы отпустили любую ссылку на FirebaseAuth.DefaultInstance), вызовы другихПродукты Firebase не будут содержать информацию для аутентификации.

Я бы порекомендовал обновиться до последней версии SDK, если вы можете, но также попытайтесь сохранить FirebaseAuth в сценарии, помеченном как DontDestroyOnLoad. Примерно так:

public class AuthHolder: MonoBehaviour {
    public FirebaseAuth Auth {get; private set;}

    void Start() {
        Auth = FirebaseAuth.DefaultInstance;
        DontDestroyOnLoad(gameObject); // should be at the root of a scene
    }

    void OnDestroy() {
        Auth = null; // make sure it can get cleaned up when you exit the game
    }
}

Если это исправит вашу проблему в последнем SDK Firebase Unity, откройте проблему на странице GitHub Issues .

Если выеще не видел, я немного подробнее расскажу об аутентификации и Unity в этом видео . Хотя он фокусируется на электронной почте / пароле, а не на анонимной аутентификации.

Надеюсь, это поможет!

- Патрик

...