В Firebase Auth, как определить, что анонимный пользователь был ОБНОВЛЕН, например, пользователем Facebook? - PullRequest
2 голосов
/ 13 апреля 2020

У меня есть одноэлементное приложение в моем 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?

1 Ответ

1 голос
/ 13 апреля 2020

как определить, что пользователь был обновлен с анонимного до, например, Facebook?

Когда анонимный пользователь регистрируется впервые, сохраните тип аутентификации в базе данных:

Firestore-root
  |
  --- users (collection)
        |
        --- uid
             |
             --- type: "anonymous"

Когда пользователь меняет тип аутентификации, вы должны просто изменить поле type в базе данных, чтобы оно содержало «Facebook» вместо «анонимный». Это возможно, потому что uid всегда будет одинаковым, независимо от того, какой идентификатор провайдера. Чтобы получить уведомление о выполнении операции, просто присоедините прослушиватель к свойству type, и вы получите уведомление в режиме реального времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...