我正在使用Firebase后端开发应用程序,我正在使用Firebase Auth登录我的应用程序。我做了所有的集成,每件事和我的应用程序都运行良好。
但我现在只希望与单个用户进行单个会话,而单个用户ID我可以通过多个设备登录。
所以我想限制用户,一次用户可以在单个设备中登录。
我正在使用自定义身份验证和用户名密码登录:
Auth.auth().signIn(withCustomToken: customToken ?? "") { (user, error) in
// ...
}
如果用户在另一台设备上以相同的ID登录,我想显示警告"您已登录其他设备"。
Firebase Auth lib是否有可能进行单用户单一会话?
编辑:建议重复的问题不会完全解决我的问题,虽然它可以帮助我理解scenireo并帮助解决我的问题。
感谢@Frenk指出这一点。
答案 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线程,因为我从这个答案中得到了一些提示。