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

Cod*_*ger 3 ios firebase swift firebase-authentication

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

但我只想与单个用户进行单个会话,因为现在使用单个 userId 我可以通过多个设备登录。

所以我想限制用户一次只能在单个设备上登录。

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

Auth.auth().signIn(withCustomToken: customToken ?? "") { (user, error) in
  // ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:建议的重复问题不会完全解决我的查询,尽管它可以帮助我理解场景并帮助解决我的问题。

感谢@Frenk 指出了这一点。

Cod*_*ger 5

我对通过 Firebase 身份验证遇到的上述问题进行了很多搜索,经过大量研究后,我最终得到了以下解决方案,该解决方案按照我的要求工作。

首先,Firebase 没有在其库中提供此功能,因此我们需要在此处应用自定义逻辑以在我们的应用程序中实现 1 会话用户登录。

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

步骤 2:在该块中返回成功时,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]
    }
Run Code Online (Sandbox Code Playgroud)

通过这种方法,我们检查当前用户 uId 在我们的 SignIn Child 中是否具有 True 值,如果我们的数据库中存在具有 Boll 值 True 的数据,我们需要处理该问题并显示一些警报并从 firebase 退出。

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

现在是用户手动从应用程序注销的最后一步

第 3 步:当用户单击应用程序中的“注销”按钮时,我们需要使用其中的 False 值更新“子项”,以便之后用户可以在任何其他设备中登录。为此我们可以使用下面的方法。

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]
    }
Run Code Online (Sandbox Code Playgroud)

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

希望这会帮助其他人。

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