如何检查电子邮件地址是不是已在 iOS 上的 Firebase 中使用?

Posted

技术标签:

【中文标题】如何检查电子邮件地址是不是已在 iOS 上的 Firebase 中使用?【英文标题】: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 之前检查的原因。 【参考方案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) )

【讨论】:

以上是关于如何检查电子邮件地址是不是已在 iOS 上的 Firebase 中使用?的主要内容,如果未能解决你的问题,请参考以下文章

使用 MailChimp API v3.0 检查电子邮件地址是不是已在列表中,而无需订阅电子邮件地址

如何检查输入的电子邮件 ID 是不是已在 Paypal 中注册?

Firebase Auth 和 Swift:检查电子邮件是不是已在数据库中

如何检查iOS app是不是支持IPv6地址

如何检查重用标识符是不是已在 UITableView 中注册?

如何在调用之前检查 Java Web 服务是不是已在 PL/SQL 中启动并运行