繁体   English   中英

如何检查Firebase认证中是否存在email?

[英]How to check if an email exists in Firebase Authentication?

我正在尝试检查 email 是否已存在于 Firebase 身份验证中,但我可以找到 Java 的内容。我正在尝试执行类似搜索电子邮件列表的操作,如果 email 不在数据库中 (emailNotExistsInDatabase(email)) ,然后继续。

除了来自 Alex 的非常完整的响应之外,另一种可能的方法是使用您从应用程序调用的Callable Cloud Function

由于我们在 Cloud Functions 中使用 Admin SDK,您可以使用getUserByEmail()方法。

function 看起来像:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

exports.checkEmailExists = functions.https.onCall((data, context) => {

    return admin.auth()
        .getUserByEmail(data.email)
        .then((userRecord) => {
            return { emailExists: true }
        })
        .catch((error) => {
            throw new functions.https.HttpsError('invalid-argument', "email doesn't exist");
        });

});

使用这种方法,您不需要特定的 Firestore 集合。 Admin SDK会直接查询Auth服务。

查看文档以获取有关如何从您的应用调用 Callable Cloud Function 的说明。


请注意,如果您想检查应用程序(例如 Android 应用程序)中的用户是否存在,上述方法是有效的。

如果您已经从基于 Java 的服务器使用 Admin SDK ,则只需在服务器代码中使用getUserByEmail()方法。

FirebaseAuth class 中没有任何方法可以帮助您检查基于 email 地址的用户是否存在。 如果您需要该功能,则必须自己创建。 这意味着当用户首次登录您的应用时,使用如下所示的架构将用户数据保存在Firestore中:

db
|
--- users (collection)
     |
     --- $uid (document)
          |
          --- email: "user-email@gmail.com"

要检查具有user-email@gmail.com的用户是否已经存在,那么您必须在 Java 中执行如下所示的查询:

FirebaseFirestore db = FirebaseFirestore.getInstance();
Query queryByEmail = db.collection("users").whereEqualTo("email", "user-email@gmail.com");
queryByEmail.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            for (QueryDocumentSnapshot document : task.getResult()) {
                if (document.exists()) {
                    Log.d(TAG, "User already exists.");
                } else {
                    Log.d(TAG, "User doesn't exist.");
                }
            }
        } else {
            Log.d(TAG, task.getException().getMessage()); //Never ignore potential errors!
        }
    }
});

另一种解决方案是使用Query#count()方法:

queryByEmail.count();

如果结果 > 0 则表示该用户已经存在,否则不存在。

如果你想检查给定的 email 地址是否与 Firebase 中的用户配置文件相关联,你可以调用fetchSignInMethodsForEmail API

请注意,此 API 为恶意用户提供了一种执行所谓的枚举攻击的方法,因此您现在实际上可以禁用fetchSignInMethodsForEmail - 在这种情况下,从您的应用程序调用它会失败。

另见:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM