Firebase - преобразовать анонимного пользователя в зарегистрированного пользователя?

Контекст: в моей игре для iOS я хотел бы разрешить пользователям играть без входа в систему (анонимно аутентифицируясь в Firebase для сохранения пользовательских данных), но также дать им возможность войти через Facebook, чтобы разблокировать дополнительный игровой процесс.

Я пытаюсь изменить это post, заменив входы в Твиттер анонимными входами:

"users": {
    "$userid": {
      // Require the user to be logged in, and make sure their current credentials
      // match at least one of the credentials listed below, unless we're creating
      // a new account from scratch.
      ".write": "auth != null && 
        (data.val() === null || 
        (auth.provider === 'facebook' && auth.uid === data.child('facebook/id').val() || 
        (auth.provider === 'anonymous' && auth.uid === data.child('anonymous/id').val()))"
    }
  }

Я запутался, как переход будет работать с этими правилами. В частности, скажите:

  1. Пользователь проходит аутентификацию анонимно и может создать каноническую запись пользователя со своим анонимным uid, хранящимся под users/"$userid"/anonymous/id. Это разрешено, поскольку пользователь аутентифицирован и объект пользователя устанавливается впервые (auth != null && data.val() === null).

  2. Любые последующие записи в users/"$userid"/ разрешены, поскольку анонимный идентификатор аутентифицированного пользователя хранится в дереве пользователей (auth != null && (auth.provider === 'anonymous' && auth.uid === data.child('anonymous/id').val())).

  3. Пользователь входит в Facebook. Теперь authData содержит uid facebook, который еще не был записан в users/"$userid"/facebook/id. Запись в это место завершается ошибкой, так как это запрещено правилами безопасности.

Таким образом, анонимный пользователь не имеет доступа к uid facebook до тех пор, пока аутентификация facebook не завершится. В этот момент уже слишком поздно писать в users/"$userid"/facebook/id, потому что аутентифицированный пользователь теперь является пользователем facebook и не имеет права писать туда.

Я что-то пропустил? Есть идеи, как исправить эту ситуацию?


person kcmoffat    schedule 01.02.2016    source источник
comment
аналогичный пост здесь: stackoverflow.com/questions/ 19897994/   -  person dotnetcoder    schedule 02.07.2016