У меня есть следующий вариант использования, который работает, как и ожидалось:
- новый пользователь заходит на сайт
- пользователь получает
user.uid
от анонимного входа из firebase - пользователь создает документ, имеющий в качестве userId ссылку на вышеупомянутую
user.uid
- на той же самой странице, на которую приглашается войти пользователь, в противном случае документ будет утерян
- пользователь входит в систему инаходит в этом аккаунте документ
WIN!
Теперь у меня есть сценарий использования, который не работает должным образом:
- возвращающийся пользователь с истекшим сеансом или из другого браузера прибывает на веб-сайт
- пользователь получает
user.uid
от анонимного входа из firebase - пользователь создает документ, имеющий в качестве userId ссылку на вышеупомянутое
user.uid
- на той же странице пользователю предлагается войти в систему, в противном случае документ будет утерян
- пользователь войдет в систему и не найдет в этом аккаунте документ
НЕ ВЫИГРАЛ В ЭТО ВРЕМЯ: (
Я настроил firebase auth со следующей конфигурацией:
const uiConfig = {
signInFlow: 'popup',
autoUpgradeAnonymousUsers: true,
signInOptions: [
firebase.auth.GoogleAuthProvider.PROVIDER_ID,
],
callbacks: {
signInFailure: (error: any) => {
if (error.code != 'firebaseui/anonymous-upgrade-merge-conflict') {
return Promise.resolve();
}
var cred = error.credential;
return firebase.auth().SignInAndRetrieveDataWithCredential(cred);
}
},
};
Итак, как вы можете видеть, проблема в том, чтов первый раз autoUpgradeAnonymousUsers
создайте новый идентификатор пользователя с анонимным идентификатором пользователя, и все в порядке, но, конечно, второй раз больше не работает.
Как мне решить эту проблему, учитывая это в моих правилах безопасностиЯ хочу создать проверку, что userId
не может быть обновлено И документ может просматривать только запрос с тем же userId?
правила безопасности:
allow create: if request.auth.uid != null
allow read: if request.auth.uid == resource.data.userId
&& request.auth.uid != null
allow update: if request.auth.uid == request.resource.data.userId && resource.data.userId == request.resource.data.userId && request.auth.uid != null
Спасибо.