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