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

时间:2018-06-05 12:59:51

标签: ios swift firebase firebase-authentication

我正在使用Firebase后端开发应用程序,我正在使用Firebase Auth登录我的应用程序。我做了所有的集成,每件事和我的应用程序都运行良好。

但我现在只希望与单个用户进行单个会话,而单个用户ID我可以通过多个设备登录。

所以我想限制用户,一次用户可以在单个设备中登录。

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

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

如果用户在另一台设备上以相同的ID登录,我想显示警告"您已登录其他设备"。

Firebase Auth lib是否有可能进行单用户单一会话?

编辑:建议重复的问题不会完全解决我的问题,虽然它可以帮助我理解scenireo并帮助解决我的问题。

感谢@Frenk指出这一点。

1 个答案:

答案 0 :(得分:1)

我通过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 Child中是否具有True值,如果数据存在于我们的数据库中且Boll值为True我们需要处理它并从firebase显示一些警告和signOut。

  

注意:我们允许用户登录,而不是我们正在检查   用户已登录任何其他设备,所以如果它返回True我们   需要来自firebase的SignOut()。

现在,当用户从应用程序手动注销时,最后一步

第3步:当用户点击应用中的SignOut按钮时,我们需要更新我们的Child with 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]
    }

现在只有一个app用户会话允许。

希望这会有所帮助。

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