【问题标题】:In Firebase Auth, how to detect that an anonymous user was UPGRADED to an e.g. Facebook user?在 Firebase Auth 中,如何检测匿名用户已升级到例如Facebook的用户?
【发布时间】:2020-07-25 18:28:21
【问题描述】:

我的 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 Studio 控制台中使用断点)。这实际上是我想要的行为。

所以我猜,结论是因为用户的uid没有改变,所以没有调用Auth状态监听器?

但是,我确实需要一种可靠的方法来检测此事件(意味着用户从匿名升级到例如 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

}

这不是我的问题,我的问题是:如何检测用户已从匿名升级到例如脸书?

【问题讨论】:

    标签: android firebase kotlin firebase-authentication


    【解决方案1】:

    如何检测用户已从匿名升级到例如脸书?

    匿名用户首次登录时,将认证类型保存在数据库中:

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

    当用户更改身份验证类型时,您只需将数据库中的type 字段更改为保存“Facebook”而不是“匿名”。这是可能的,因为无论提供者 ID 是什么,uid 总是相同的。要在操作发生时收到通知,只需在 type 属性上附加一个侦听器,您就会收到实时通知。

    【讨论】:

    • 是的,这可行,我想避免使用 firestore,因此我也可以将其存储为用户首选项。但是您是说 firebase api 不提供开箱即用的功能吗?如果是这样,我为它提交 CR 可能是个好主意...
    • 我不知道开箱即用的东西。是的,你应该考虑file a feature request
    • 功能请求已提交!
    • 很高兴听到这个消息 ;)
    猜你喜欢
    • 2020-07-21
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    相关资源
    最近更新 更多