Firebase Auth 和 Swift:检查电子邮件是不是已在数据库中
Posted
技术标签:
【中文标题】Firebase Auth 和 Swift:检查电子邮件是不是已在数据库中【英文标题】:Firebase Auth and Swift: Check if email already in databaseFirebase Auth 和 Swift:检查电子邮件是否已在数据库中 【发布时间】:2019-06-28 11:51:18 【问题描述】:我正在开发一个 ios 应用,它将使用 Firebase 进行用户管理(注册、登录等)
我是 Firebase 的新手,但基本上一切正常。我已经连接了它,我已经创建了用户并登录了等等。
但是,我正在尝试更改我的 UI,以便“注册”按钮最初是隐藏的,并且只会在以下情况下出现:
-
所有字段都不为空
电子邮件地址有效(使用正则表达式)
电子邮件地址不在数据库中
用户名不在数据库中
password 和 confirmPassword 字段相等
我不知道#3 和#4。
我一直在阅读文档、观看视频、在 StackO 及其他地方寻找链接,但我想不通。
谁能指出我正确的方向?
【问题讨论】:
您是否将电子邮件地址和用户名写入 firebase 数据库? 请将您的问题edit 显示your attempt far,您将更有可能收到有助于您进步的答案。以minimal reproducible example 向我们展示您的工作,您所期望的结果和您得到的结果,我们将帮助您解决问题。重新阅读How to Ask可能会有所帮助。 @EmreCiftci 是的,我做到了。正如我在问题中所说,我已经成功创建用户并登录了,所以这两个字段自然在数据库中并且有实际数据。 @TobySpeight 这不是我第一次发布问题。所以感谢那个链接。这是我找不到任何可以尝试的时间。也许如果您阅读了我的问题,您会注意到我已经对此进行了很多研究,但找不到任何可以帮助我解决的问题。你想看我的“尝试远”吗?那么我是否应该简单地发布指向数十个 YT 视频、Firebase 文档和教程以及我读过的其他文章的链接,这些文章并没有帮助我到达我想去的地方?因为那看起来真的没用:“嘿,伙计们,这里有一堆没用的东西。” 本网站的目的是帮助解决特定和可重复的编码问题。问题的问题是没有足够的细节 - 任何答案都只是猜测,这就是为什么@TobySpeight 要求查看代码,以便我们可以确定正在使用哪种类型的身份验证。这是模糊的用户名不在数据库中 用户名存储在哪里?在 /users 节点中?别的地方?用户名是否与电子邮件地址相同?我发布了一个做了很多假设的答案,如果它没有提供解决方案,请用更多细节更新问题,我们会看看。 【参考方案1】:如果您使用电子邮件和密码验证,解决方案非常简单。
Firebase 身份验证不允许重复电子邮件,因此当执行 createUser 函数时,如果电子邮件已存在,Firebase 将在错误参数中返回 emailAlreadyInUse 错误。然后,您可以将其转换为 NSError 以查看它是哪一个并正确处理。
所以函数是这样的
Auth.auth().createUser(withEmail: createEmail, password: password ) user, error in
if let x = error
let err = x as NSError
switch err.code
case AuthErrorCode.wrongPassword.rawValue:
print("wrong password")
case AuthErrorCode.invalidEmail.rawValue:
print("invalid email")
case AuthErrorCode.accountExistsWithDifferentCredential.rawValue:
print("accountExistsWithDifferentCredential")
case AuthErrorCode.emailAlreadyInUse.rawValue: //<- Your Error
print("email is alreay in use")
default:
print("unknown error: \(err.localizedDescription)")
//return
else
//continue to app
我在那个 case 语句中抛出了一些随机错误,但请查看链接以获取所有 AuthErrorCodes 的完整列表。
你也可以这样做
Auth.auth().fetchSignInMethods(forEmail: user, completion: (signInMethods, error) in
print(signInMethods)
)
【讨论】:
但是,我正在尝试预先检查,即除非满足条件(例如,唯一的电子邮件地址),否则不允许调用createUser
。所以,我隐藏了“注册”按钮,并且只想在我已经知道该电子邮件地址不在数据库中时才显示它。
@Zonker.in.Geneva 除非您向未经身份验证的用户打开存储电子邮件地址的节点,否则您将无法这样做,这将导致任何人都能够读取所有用户的电子邮件地址- 这显然是一个垃圾邮件问题。
在 firebase 文档中,我在 API Reference > javascript > firebase.auth > Auth 中找到了一个名为“fetchSignInMethodsByEmail”的方法。这显然将返回特定电子邮件地址的签名方法列表,如果找不到,则返回 nil
。这似乎是我需要的,但是……它是 JavaScript。任何想法如何使用此功能?我需要编写 Firebase 云函数吗?如果是这样,我如何从我的 Xcode/Swift/iOS 应用程序中访问该功能?
@Zonker.in.Geneva 更新了答案。试试看。
我要解决的问题是:我想要一个布尔变量,如果电子邮件在身份验证列表中,则为 true
,如果不在,则为 false
。这种方法使用闭包的事实很烦人,因为正如您所说,从闭包中获取值并不简单。但是,我通过在闭包外部定义我的Bool
并在闭包内部使用self.
引用它确实找到了答案。像魅力一样工作。【参考方案2】:
我觉得你可以用这个方法检查一下
let ref1 = Database.database().reference().child("Users").queryOrdered(byChild: "UserName").queryEqual(toValue: "UserName enter by user")
ref1.observeSingleEvent(of: .value) (sanpshot) in
print(sanpshot.exists()) // it will return true or false
电子邮件也是如此。
【讨论】:
谢谢,我试试看。 这无助于验证电子邮件地址是否不存在(因为您现在有一个 AND 子句)并且此查询不能由未经身份验证的用户运行,因为默认规则不允许。以上是关于Firebase Auth 和 Swift:检查电子邮件是不是已在数据库中的主要内容,如果未能解决你的问题,请参考以下文章
Firebase Auth 密码重置 iOS Swift - 更新 Firebase 数据库
Firebase Auth.auth().createUser 方法跳过 ios, swift
如何通过 iOS(swift)将 Firebase Auth 与 MySQL DB 同步?
如何检查用户是不是已使用 Google Sign in 和 Firebase Auth 登录以检索他们的数据?
Swift Facebook Auth with firebase canOpenURL:URL 失败:“fbauth2:/” - 错误:“操作无法完成。(OSStatus 错误 -10814。)”