Когда пользователь начинает использовать наше приложение, мы регистрируем его, используя анонимный вход Firebase. Позже мы позволим им войти в систему с социальными провайдерами, такими как Apple. Мы используем "auth (). CurrentUser? .LinkWithCredential", чтобы связать социальные учетные данные с идентификатором анонимного пользователя.
Мы столкнулись с ситуацией, которую не знаем, как решить:
Пользователь устанавливает приложение на устройстве и использует вход в систему с помощью Apple для входа. Мы связываем анонимную учетную запись с именем входа Apple, и все работает просто отлично.
Но сейчас пользователь покупает новое устройство. Он устанавливает приложение и запускает его. Он получает новый анонимный UID. Затем он пытается войти с Apple. Теперь, если мы пытаемся вызвать linkWithCredential, мы получим ошибку: «auth / credential-уже используется]. Эти учетные данные уже связаны с другой учетной записью пользователя»
Это, конечно, правда, поскольку учетные данные Apple были связаны с анонимным пользователем на старом устройстве. Итак, как мы можем позволить пользователю снова войти в систему с нового устройства? Мы думали перехватить ошибку, а затем вызвать signInWithCredential вместо linkWithCredential. Но тогда мы получаем ошибку: получен дубликат учетных данных. Пожалуйста, попробуйте еще раз с новыми учетными данными.
Кажется, вы не можете использовать учетные данные Apple для более чем одного вызова.
Итак, еще раз - мы застряли, не имея возможности позволить пользователю войти в два устройства.
let appleAuthRequestResponse = null;
try {
appleAuthRequestResponse = await appleAuth.performRequest({
requestedOperation: AppleAuthRequestOperation.LOGIN,
requestedScopes: [
AppleAuthRequestScope.EMAIL,
AppleAuthRequestScope.FULL_NAME,
],
});
} catch (err) {
// TODO: decide what to do
return;
}
const {
identityToken,
nonce
} = appleAuthRequestResponse;
const appleCredential = auth.AppleAuthProvider.credential(
identityToken,
nonce
);
let userCredentials = null;
try {
userCredentials = await auth().currentUser ? .linkWithCredential(
appleCredential
);
// This will work on the first device but fail on the second one
console.log(userCredentials);
} catch (err) {
// This will fail as well with error: Duplicate credential received
await auth().signInWithCredential(appleCredential)
}