Firebase通过电子邮件获取用户UID

时间:2018-06-19 12:30:02

标签: swift firebase firebase-realtime-database firebase-authentication

我正在为我的Firebase应用程序构建一个管理面板,希望管理起来更轻松一些。我希望能够通过电子邮件查找用户,然后在必要时将其删除。我了解,如果注册了用户以及他们向其注册了哪个提供程序,则fetchSignInMethods将返回一个值,但是仍然可以查询身份验证树(而非数据库树)以通过电子邮件搜索用户吗?能够从Authentication节点获取与电子邮件相关联的UID会很好。

当前,我的应用程序仅使用电子邮件/密码身份验证(没有Facebook,Twitter等),这就是我检查用户是否已注册的方式:

private func showIfUserIsRegistered(with email: String) {
    Auth.auth().fetchSignInMethods(forEmail: email) { (providers, error) in
        if error != nil {
            KVNProgress.showError(withStatus: error.debugDescription)
            return
        }
        let doesntExist = "No, this user doesn't exist."
        let exists = "Yes, user exists and is registered."
        let passwordProvider = "password"
        guard let sources = providers else {
            KVNProgress.showError(withStatus: doesntExist)
            return
        }
        let registered = sources.first == passwordProvider ? exists : doesntExist
        KVNProgress.showSuccess(withStatus: registered)
    }
}

我确实将用户的信息保存在数据库节点中,但是我可以查询到该信息,但是,超过75,000个用户的调用成本很高并且需要一段时间才能返回,这在Authentication调用的情况下无济于事注册用户成功,但是将其详细信息存储到Database节点失败。

1 个答案:

答案 0 :(得分:1)

客户端SDK中没有API可以通过其电子邮件地址查找UID。长期以来,通过数据库执行此操作一直是惯用的方法。

但是,该操作在Firebase Admin SDK中确实存在。来自documentation on getting user data

admin.auth().getUserByEmail(email)
  .then(function(userRecord) {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log("Successfully fetched user data:", userRecord.toJSON());
  })
  .catch(function(error) {
    console.log("Error fetching user data:", error);
  });

此代码在Node.js的JavaScript中,但是Admin SDK也支持Java,Go和Python中的此操作。

Firebase Admin SDK旨在在受信任的环境(例如您控制的服务器或Cloud Functions)中运行。它们以管理特权运行,并允许完全访问项目中的资源。因此,它们实现了客户端SDK中(安全)不可能的某些操作。

因此,如果您不想从数据库中列出用户,通常的方法是使用Admin SDK构建后端(可能非常简单),然后从您的应用中调用它。请确保正确保护后端,否则您将失去将Admin SDK与客户端SDK分开带来的安全优势。