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 同步?

Swift4:从 Firebase 下载照片

如何检查用户是不是已使用 Google Sign in 和 Firebase Auth 登录以检索他们的数据?

Swift Facebook Auth with firebase canOpenURL:URL 失败:“fbauth2:/” - 错误:“操作无法完成。(OSStatus 错误 -10814。)”