Firebase - преобразовать анонимного пользователя вошедшего в систему пользователя?
Контекст: в моей игре для iOS я хотел бы разрешить пользователям играть без входа в систему (аутентификация анонимно в Firebase для сохранения пользовательских данных), но также дать им возможность войти через Facebook, чтобы разблокировать дополнительный игровой процесс.
Я пытаюсь изменить этот пост, заменив логины Twitter анонимными:
"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()))"
}
}
Я запутался, как переход будет работать с этими правилами. В частности, сказать:
Пользователь аутентифицируется анонимно и может создать каноническую запись пользователя с анонимным идентификатором пользователя, хранящимся в
users/"$userid"/anonymous/id
, Это разрешено, потому что пользователь проходит проверку подлинности, а пользовательский объект устанавливается впервые (auth != null && data.val() === null
).Любые последующие записи в
users/"$userid"/
разрешены, потому что анонимный идентификатор аутентифицированного пользователя хранится в дереве пользователя (auth != null && (auth.provider === 'anonymous' && auth.uid === data.child('anonymous/id').val())
).Пользователь заходит на фейсбук. Сейчас
authData
содержит идентификатор пользователя Facebook, который еще не был записанusers/"$userid"/facebook/id
, Сбой записи в это местоположение, потому что правила безопасности не позволяют этого.
Таким образом, анонимный пользователь не имеет доступа к идентификатору Facebook до тех пор, пока не завершится аутентификация Facebook. На этом этапе уже поздно писать users/"$userid"/facebook/id
потому что аутентифицированный пользователь теперь является пользователем Facebook и не имеет права писать туда.
Я что-то пропустил? Любые идеи о том, как исправить эту ситуацию?