【问题标题】:How to check if an email address is already in use in Firebase on iOS?如何检查电子邮件地址是否已在 iOS 上的 Firebase 中使用?
【发布时间】:2017-07-27 17:17:20
【问题描述】:

我正在为我的 iOS 应用程序使用 Firebase 身份验证。现在我想检查输入的电子邮件地址是否可用。我发现我必须为此使用createUserWithEmailAndPassword。但问题是我不想传递密码。我只想使用电子邮件进行检查。我该怎么做?

【问题讨论】:

  • 如果电子邮件被接收,Firebase 身份验证已经返回错误。为什么要在用户输入密码之前进行检查?
  • 您要查看电子邮件是什么意思?您是否要确保该电子邮件已被使用?还是什么?
  • 实际上我的设计就像有第一页用户将输入电子邮件地址。如果该电子邮件已注册,则用户导航到下一个页面,即密码页面,用户将在其中输入密码并在应用程序中唱歌。所以在第一页我想检查电子邮件是否已注册。 @JenPerson
  • @JenPerson 在我的 UI 中,我隐藏了“注册”按钮,直到所有字段都正确填写,包括数据库中尚未包含的 有效 电子邮件地址,尚未使用的用户名和包含与密码字段相同的密码的 passwordConfirmation 字段。这可能是他想要发出 createUser 之前检查的原因。

标签: ios swift firebase firebase-authentication


【解决方案1】:

以下是您可能正在寻找的Firebase function 的结构(Swift 4):

Auth.auth().fetchProviders(forEmail: emailAddress, completion: {
        (providers, error) in

        if let error = error {
            print(error.localizedDescription)
        } else if let providers = providers {
            print(providers)
        }
    })

如果电子邮件地址已注册给用户,您将获得使用该电子邮件地址的提供商的列表。否则,提供者列表将为空,因此电子邮件地址未注册。

【讨论】:

  • fetchProviders 已弃用
【解决方案2】:

您需要使用 fetchProvidersForEmail:completion: https://firebase.google.com/docs/reference/ios/firebaseauth/api/reference/Classes/FIRAuth#-fetchprovidersforemailcompletion

它将返回与该电子邮件关联的提供商 ID 列表。如果您在列表中获得“密码”,则该电子邮件的电子邮件/密码帐户已经存在,您可以显示您的登录页面。

【讨论】:

    【解决方案3】:

    Firebase 身份验证中具有电子邮件地址的任何用户帐户都可以进行验证,它不必是电子邮件+密码帐户。 To verify the email address for a user call user.sendEmailVerification().

    如果您想在注册用户之前检查一个电子邮件地址是否已经在使用中,Firebase Admin SDK 有一个look up a user by their email address 的方法:admin.auth().getUserByEmail(email)。此方法需要管理权限,并且(与所有 Admin SDK 一样)只能在受信任的环境中运行 - 通常是您控制的服务器或 Cloud Functions for Firebase。

    最后说明:请注意,即使您在注册前检查了该电子邮件地址是否可用,但在您致电createUserWithEmailAndPassword() 时,该电子邮件地址可能已被其他用户认领。正如 Jen 评论的那样:如果电子邮件地址已被使用,您还需要处理 createUserWithEmailAndPassword() 引发的错误。

    【讨论】:

    • 谢谢!不使用admin.auth().getUserByEmail(email)的任何其他选项?
    【解决方案4】:

    很遗憾,您无法使用 Firebase 执行此操作。电子邮件帐户也需要密码。

    如果您不希望用户输入密码,您可以使用其他帐户选项,例如 Facebook、Google、Twitter 等。

    【讨论】:

    • 实际上我的设计就像有第一页用户将输入电子邮件地址。如果该电子邮件已注册,则用户导航到下一个页面,即密码页面,用户将在其中输入密码并在应用程序中唱歌。 @布拉德利
    【解决方案5】:

    您只需要在用户注册 FirebaseDB 的父“用户”时创建一个引用,这些用户的电子邮件 id 已在 firebase 应用程序中注册为“电子邮件”,并在您检查电子邮件是否存在时运行以下查询调用或不是

     let databaseReff = Database.database().reference().child("users")
    
                        databaseReff.queryOrdered(byChild: "email").queryEqual(toValue: self.emailTextField.text!).observe(.value, with: { snapshot in
                            if snapshot.exists(){
    
                               //User email exist
                            }
                            else{
                                //email does not [email id available]
                            }
    
                        })
    

    【讨论】:

      【解决方案6】:

      以下代码用于更新了 firebase 版本的 swift5。 Auth.auth().fetchSignInMethods(forEmail: emailAddress, completion: { (providers, error) in if let error = error { print(error.localizedDescription) } else if let providers = providers { print(providers) } })

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-09
        • 2016-08-20
        • 2012-09-09
        • 2019-09-04
        • 1970-01-01
        • 2016-04-06
        • 1970-01-01
        相关资源
        最近更新 更多