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 指出了这一点。
我对通过 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)
就是这样,现在只有一个应用程序用户会话允许。
希望这会帮助其他人。
感谢这个帖子,因为我从这个答案中得到了一些提示。
| 归档时间: |
|
| 查看次数: |
8213 次 |
| 最近记录: |