【问题标题】:Link several user accounts (same email) Firebase链接多个用户帐户(同一电子邮件)Firebase
【发布时间】:2022-11-25 17:01:58
【问题描述】:

我有可能让用户选择是否要使用 Google、Facebook、电子邮件/密码等登录。

测试我的应用程序后,发生了以下情况:

  1. 我用我的名字、电子邮件和密码注册
  2. 处理入门逻辑
  3. 在 Firebase 上验证我的授权用户(灰色电子邮件图标)
  4. 退出账户
  5. 现在,我想使用 Google 登录(与注册时使用的电子邮件和密码相同的电子邮件)
  6. Google 登录有效
  7. 在 Firebase 上验证我的授权用户(灰色电子邮件图标变为 Google 图标)
  8. 退出账户
  9. 无法再使用电子邮件和密码登录,但谷歌登录有效

    经过一些研究,我得到了Link Multiple Auth Providers to an Account on Android documentation

    我意识到我必须重构我的代码才能不使用 Firebase Auth.sign In With 方法

    除了我的 loginEmailAndPassword 之外还有一点:

    val credential = EmailAuthProvider.getCredential(email, password)
    
    firebaseAuth.currentUser!!.linkWithCredential(credential).addOnCompleteListener{ authTask: Task<AuthResult> ->
        if (authTask.isSuccessful) {
    

    我有一个“其他”意味着 (authTask.isSuccessful) 没有发生,另一个“如果”与 FirebaseAuthUserCollisionException

                    val exception: java.lang.Exception? = authTask.exception
                if (exception is FirebaseAuthUserCollisionException) {
                    linkAndMerge(credential)
    

    我的目标是链接和合并,我不知道如何链接帐户(灰色电子邮件和 Firebase 上的 Google)

        private fun linkAndMerge(credential: AuthCredential) {
        val authenticatedUserMutableLiveData: MutableLiveData<ResponseState<UserModel>> =
            MutableLiveData()
    
        val prevUser = firebaseAuth.currentUser
        firebaseAuth.signInWithCredential(credential)
            .addOnSuccessListener { result ->
                val currentUser = result.user
                // Merge prevUser and currentUser accounts and data
                // ...
    
            }
            .addOnFailureListener {
                authenticatedUserMutableLiveData.value = ResponseState.Error("Error")
            }
    }
    

    我的问题:

    1. 我可以调用一些东西来合并 prevUser 和 currentUser 帐户吗?我只想让用户有可能使用不同的身份验证。
    2. 我不担心数据,因为如果它是相同的用户 UID,则身份验证提供程序无关紧要
    3. 我还能使用“createUserWithEmailAndPassword”吗?

【问题讨论】:

    标签: android firebase kotlin google-cloud-platform firebase-authentication


    【解决方案1】:

    第 1 步到第 9 步提供 expected behavior。如果您使用电子邮件和密码创建用户,并在之后立即使用 Google 登录,则该帐户将只能通过 Google 访问。为什么?因为在幕后,Firebase 会将使用电子邮件和密码创建的帐户转换为 Google 提供商的帐户。不幸的是,您无法撤消该更改。

    您问题中的 link 指的是将现有帐户链接到特定提供商的可能性。例如,如果您实施 anonymous authentication,则您可以将该帐户与 Google 相关联。这意味着 UID 保持不变。

    如果您想阻止该机制的发生,那么您应该考虑允许为不同的提供者创建不同的帐户。您可以在 Firebase 控制台的“身份验证”中的“设置”选项卡中找到这个名为“为每个身份提供者创建多个帐户”的选项。

    【讨论】:

      猜你喜欢
      • 2020-07-16
      • 2020-05-06
      • 1970-01-01
      • 2017-06-14
      • 2011-03-06
      • 2020-11-08
      • 2018-06-23
      • 2023-04-01
      • 2016-11-12
      相关资源
      最近更新 更多