当前位置: 首页 > 知识库问答 >
问题:

Firebase身份验证登录必须允许单设备登录

郏瀚
2023-03-14

我正在Firebase后端的帮助下开发应用程序,并且我正在使用Firebase Auth登录我的应用程序。我已经完成了所有集成和所有事情,我的应用程序运行良好。

但我只希望与单个用户的单个会话,因为现在用单个用户Id,我可以通过多个设备登录。

因此,我想限制用户一次只能在一台设备上登录。

我正在使用自定义身份验证和用户名密码登录:

Auth.auth().signIn(withCustomToken: customToken ?? "") { (user, error) in
  // ...
}

如果用户在另一台设备中使用相同的ID登录,我想显示“您已经登录到另一台设备”的警报。

Firebase Auth lib中是否有可能用于单用户单会话?

编辑:建议的重复问题不能完全解决我的问题,尽管它有助于我理解场景并帮助我解决问题。

谢谢@Frenk指出这一点。

共有1个答案

浦墨竹
2023-03-14

我通过firebase身份验证对上述问题进行了大量搜索,经过大量研究,我最终找到了以下解决方案,该解决方案符合我的要求。

首先,Firebase在他们的库中没有提供这个,所以我们需要在这里应用我们的自定义逻辑来实现我们应用程序中的1会话用户登录。

第1步:您需要在数据库的根目录下添加新子“登录”。

第二步:While Auth.auth()。signIn()在我们需要检查以下标志块中返回成功,即用户已经在任何其他设备中登录?为此,我创建了一个方法,如下所述。

func alreadySignedIn() {
        // [START single_value_read]
        let userID = Auth.auth().currentUser?.uid
        ref.child("SignIn").child(userID!).observeSingleEvent(of: .value, with: { (snapshot) in
            // Get user value

            if let dict = snapshot.value as? [String: Any] {
                if let signedIn = dict["signIn"] as? Bool {
                    if signedIn {
                        self.signOut()
                    }
                    else {
                        // change the screen like normal
                        print("First Session of user")
                        self.writeNewUserSigin(withUserID: userID!)
                    }
                }else{
                    self.writeNewUserSigin(withUserID: userID!)
                }
            }else{
                print(snapshot)
                self.writeNewUserSigin(withUserID: userID!)
            }
        }) { (error) in
            print(error.localizedDescription)
        }
        // [END single_value_read]
    }

通过这种方法,我们检查当前用户uId在我们的登录子节点中的值是否为真,如果数据在我们的数据库中,Boll值为真,我们需要处理它,并显示一些警告和从html" target="_blank">firebase注销。

注意:由于我们允许用户登录,并且我们正在检查该用户已经在任何其他设备上登录,因此如果它返回True,我们需要从Firebase中SignOut()。

现在是用户手动退出应用程序的最后一步

步骤3:当用户点击应用程序中的SignOut按钮时,我们需要用False值更新Child,以便以后用户可以在任何其他设备中登录。为此,我们可以使用以下方法。

func updateUserSigIn(withUserID userID: String) {
        //Update SignIn Child with flase value on current UID
        // [START write_fan_out]

        let post = ["signIn": false]
        let childUpdates = ["/SignIn/\(userID)": post]
        let ref = Database.database().reference()
        ref.updateChildValues(childUpdates) { (error, refDatabase) in
            if (error != nil) {
                print("error \(String(describing: error))")
            }else {
                print("New user Saved successfully")
                self.signOut()
            }
        }
        // [END write_fan_out]
    }

就是这样,现在只允许一个应用程序用户会话。

希望这能帮助别人。

谢谢你的这个帖子,因为我从这个答案中得到了一些提示。

 类似资料:
  • 使用,https://github.com/firebase/FirebaseUI-Android/tree/master/codelabs/chat作为登录的参考,我在键入时似乎遇到了问题 我只能键入Auth的提供者,而不能键入,为什么会这样,它提示我键入社会提供者。

  • 当使用Firebase身份验证匿名帐户时,它偶尔会在系统中创建一个新的用户ID,有时它会使用相同的用户ID。我真的希望每次都能创建相同的用户ID,这样匿名用户仍然可以在应用程序中维护相同的进度/数据。这实际上是我开始使用Firebase的原因。即使在重新启动应用程序等之后,我如何始终维护一个匿名帐户来保持相同的用户ID? 我希望用户每次以访客身份玩游戏时都能获得相同的ID。我看到有些应用程序在卸载

  • 本文向大家介绍firebase-authentication Google Plus登录身份验证,包括了firebase-authentication Google Plus登录身份验证的使用技巧和注意事项,需要的朋友参考一下 示例 使用Plus登录验证用户 onCreate onStart() 获取资料信息 使用Firebase进行身份验证, onActivityResult 登出      

  • 大家好,我对FireBase创建用户和注册用户有问题。下面是注册和登录的代码。我得到空指针异常,无法理解原因。。初始化完成了,但经过了这么多天的努力,还是弄不明白。 注册: 正在发布注册活动的日志错误: java.lang.com.google.android.gms.internal.zzdvv.zzb(未知来源)在com.google.android.gms.internal.zzdwc.zz

  • 该应用程序应该接受用户电子邮件和密码,并使用Firebase身份验证作为后端。我使用像素2作为模拟器。每次应用程序处理登录功能时,它都会崩溃。 下面是Java文件和gradle文件 Java文件:

  • 现在,我只想让那些已经注册并用我们的软件验证过的用户登录,我已经将用户的电子邮件列表(去掉特殊字符)保存在Firebase内部。当前,当用户登录时,我使用以下功能检查他们的邮件是否在此列表中: 虽然这种方法起作用,但它相当笨拙,因为用户仍然能够在函数回调被调用之前进行初始登录,并且他们的电子邮件仍然显示在FireBase中的“Authentication”选项卡中。 有没有更好的方法只允许预先验证