У меня есть одноэлементное приложение в моем Android, запущенное при запуске приложения, которое прослушивает изменения состояния аутентификации, например, так:
fun listenForAuthChanges() {
if (authStateListener != null) {
FirebaseAuth.getInstance().removeAuthStateListener(authStateListener!!)
}
authStateListener = FirebaseAuth.AuthStateListener { auth ->
val user = auth.currentUser
writeStatusToFirebase()
if (user != null) {
Log.debug("User : ${user.uid} -> ${user.loginType}")
} else {
Log.debug("User : signed out")
loginAnonymously()
}
}
FirebaseAuth.getInstance().addAuthStateListener(authStateListener!!)
}
Это отлично работает, обнаруживая, если использование вышло из системы или вошли в систему. Как вы можете видеть в приведенном выше коде, используя loginAnonymously (), когда пользователь не вошел в систему, тогда я автоматически авторизуюсь анонимно. Это все работает как чудо, однако .... когда я вызываю Firebase-UI для входа в систему и пользователь входит через Facebook, прослушиватель состояния Auth не вызывается.
Я понял, что FirebaseUI на самом деле не создайте нового пользователя, вместо этого анонимный пользователь обновится до пользователя Facebook (проверено в консоли Firebase Auth и с помощью точек останова в Android студийной консоли). На самом деле это именно то поведение, которое мне нужно.
Итак, я предполагаю, что вывод заключается в том, что прослушиватель состояния Auth не вызывается, поскольку uid пользователя не изменяется?
Однако мне нужен надежный способ обнаружить также это событие (имеется в виду, что пользователь обновился с анонимного до, например, Facebook).
Каков наилучший способ сделать это?
Примечание. Я знаю, что можно определить, какой подлинный провайдера (id), который пользователь использует для аутентификации. Вот немного кода, который я использую для этого:
val FirebaseUser.loginType: LoginType
get() {
if (isAnonymous) {
return LoginType.Anonymous
}
loop@ for (userInfo in providerData) {
when (userInfo.providerId) {
EmailAuthProvider.PROVIDER_ID -> return LoginType.Email
GoogleAuthProvider.PROVIDER_ID -> return LoginType.Google
FacebookAuthProvider.PROVIDER_ID -> return LoginType.Facebook
else -> continue@loop
}
}
return LoginType.Unknown
}
Это не моя проблема, мои вопросы: как определить, что пользователь был обновлен от анонимного до, например, Facebook?