ОБНОВЛЕНИЕ
ВКЛ IOS ответ на попытка выйти из системы, прежде чем представлять начальный поток регистрации / отправки электронной почты из FirebaseUI,так что ссылка, которая получает отправлено на их электронную почту, не содержит поле анонимного UID
(подробнее о том, почему это работает (см. ниже), см. ниже)
Некоторые детали:
Я работаю над отладкой этого безостановочно со вчерашнего дня. Итак, для всех, кто сталкивался с этой очень специфической проблемой, я хотел бы рассказать больше о контексте выше:
- Аутентификация действительно работала нормально, если я удалил учетную запись из Firebase, но только на первая попытка входа / выхода.
- В общем, я всегда выполняю вход пользователя как анонимного до тех пор, пока он не зарегистрируется (в этом случае я позволяю FirebaseUI либо выполнять автоматическое обновление, либообычный вход в систему).
Проблема заключалась в том, что я сделал предположение из (2), что FirebaseUI правильно обработает ситуацию для всех методов аутентификации. Для аутентификации ссылки электронной почты, когда пользователь первоначально вводит свою электронную почту в поток FirebaseUI, если он в то время является анонимным, он отправляет ссылку электронной почты с полем / параметром, который указывает его идентификатор анонимного пользователя. Если это поле присутствует, когда приложение снова открывается через динамическую ссылку, и эта ссылка, полученная приложением, затем отправляется этому методу:
FUIAuth.defaultAuthUI()!.handleOpen(link, sourceApplication: bundleIdentifier)
, что произойдет, если оно попытается автоматическиобновить анонимного пользователя до учетной записи электронной почты.
Теперь, при первой попытке создания новой учетной записи, это работает нормально. Но для последующих попыток использовать поток пользовательского интерфейса firebase для аутентификации той же электронной почты, он попытается автоматически обновить анонимного пользователя в учетную запись, которая уже существует, или что-то в этом духе (специфика, вероятно, будет определять, действительно ли это проблема FirebaseUI,или если это проблема FirebaseAuth, или она работает так, как задумано и т. д.).
Очевидно, что если вы полагаетесь на данные, привязанные к определенному UID, этот метод не будет работать для вас, так как UIDникогда не сохраняется при авторизации электронной почты, если вы выходите из анонимного пользователя, а затем создаете / входите с учетной записью электронной почты.
Если вам нужно сохранить UID до и после аутентификации или вы не можете выйти из системы безпроблема, и вы ДОЛЖНЫ использовать FirebaseUI, тогда я бы порекомендовал запретить пользователю выходить из системы после аутентификации внутри вашего приложения. Это не очень хорошее решение, поэтому удаление аутентификации электронной почты в качестве поставщика для FirebaseUI на iOS и использование других поставщиков аутентификации может быть лучшим временным решением.
Все вышеперечисленное является временным решением
Команда FirebaseUI уже должна знать о проблеме через https://github.com/firebase/FirebaseUI-iOS/issues/741 (которую я выяснил на самом деле точнопроблема, с которой я столкнулся, но я изначально проигнорировал это, потому что я вообще не думал, что это повторная аутентификация). Надеемся, что в скором времени им удастся еще кое-что исправить. Если бы у меня была идея, как лучше это исправить в их потоке, я бы сам сделал пиар, но так как я не собираюсь, то просто положусь на это и подожду.
Как насчет shouldAutoUpgradeAnonymousUsers = false ?
Получается, после просмотра кода для FirebaseUI / Auth / FUIAuth.m, FirebaseUI / Email / FUIEmailAuth.m и FirebaseUI/Email/FUIEmailEntryViewController.m, установив для этого флага значение false в течение всего этого процесса (регистрация / вход, отправка ссылки, открытая ссылка, обработка ссылки), ничего не изменит. Во всяком случае, это приведет к тому, что весь поток будет всегда не работать. Поскольку пользователь является анонимным при первоначальной отправке ссылки по электронной почте, он по-прежнему будет включать анонимный uid в ссылку, что, в свою очередь, приведет к тому, что метод, обрабатывающий URL, будет запускать метод, который обрабатывает обновление анонимного пользователя (поскольку существует одинчто, по-видимому, «необходимо» обновить).
FUIEmailAuth.m
- (BOOL)handleOpenURL:(NSURL *)URL sourceApplication:(nullable NSString *)sourceApplication {
...
} else if (urlParameterDict[@"ui_auid"]) {
[seld handleAnonymousUpgrade:urlParameterDict[@"ui_auid"] email:localParameterDict[kEmailLinkSignInEmailKey]];
} else {
...
}
Этот метод, который обрабатывает, затем пропускает начальную проверку, потому что мы не обновляем анонимных пользователей, которая затем пытается обработать ситуацию, как если бы пользователь открыл ссылку надругое устройство (неверно, по крайней мере, в этом случае). Что просто не позволяет пользователю войти в систему.
FUIEmailAuth.m
- (void)handleAnonymousUpgrade:(NSString *)anonymousUserID email:(NSString *)email {
// Check for the presence of an anonymous user and whether automatic upgrade is enabled.
if (self.authUI.auth.currentUser.isAnonymous &&
self.authUI.shouldAutoUpgradeAnonymousUsers &&
[anonymousUserID isEqualToString:self.authUI.auth.currentUser.uid]) {
...
} else {
[self handleDifferentDevice];
}