代码之家  ›  专栏  ›  技术社区  ›  CodeChanger

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

  •  0
  • CodeChanger  · 技术社区  · 7 年前

    我在firebase后端的帮助下开发应用程序,并使用firebase auth登录到我的应用程序中。我已经做了所有的整合和每件事,我的应用程序运行良好。

    但是我只想和一个用户进行一次会话,因为现在只有一个用户id,我可以通过多个设备登录。

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

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

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

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

    firebase auth lib中是否存在单用户单会话的可能性?

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

    谢谢@frenk指出这一点。

    1 回复  |  直到 7 年前
        1
  •  1
  •   CodeChanger    7 年前

    我通过firebase认证对上面的问题进行了大量的研究,经过大量的研究,最终得到了下面的解决方案,并按照我的要求工作。

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

    步骤1: 你需要添加新的子项“ 小精灵 “在数据库的根目录。

    步骤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]
        }
    

    通过这种方法,我们检查当前用户uid是否在signin子项中具有true值如果数据库中有boll值为true的数据,我们需要处理它并显示一些来自firebase的警报和注销。

    注意:当我们允许用户登录时 用户已在任何其他设备中登录,因此如果返回true,则 需要从firebase注销()。

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

    步骤3: 当用户点击应用程序中的注销按钮时,我们需要用错误的值更新我们的孩子,这样以后用户可以在任何其他设备中登录。为此,我们可以使用下面的方法。

    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]
        }
    

    现在只允许一个应用程序用户会话。

    希望这能帮助别人。

    谢谢 this 我从这个答案中得到了一些提示。