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

z9ju0rcb  于 2023-01-27  发布在  其他
关注(0)|答案(3)|浏览(145)

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

68bkxrlz

68bkxrlz1#

除了Alex非常完整的响应之外,另一种可能的方法是使用从应用调用的Callable Cloud Function
由于我们在Cloud Functions中使用Admin SDK,因此您可以使用getUserByEmail()方法。
函数如下所示:

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服务。
有关如何从应用调用可调用云函数的说明,请参阅文档。
请注意,如果您想从应用程序(例如Android应用程序)中检查用户是否存在,上述方法是有效的。
如果已经使用了the Admin SDK from a Java based server,则只需在服务器代码中使用getUserByEmail()方法。

jk9hmnmh

jk9hmnmh2#

FirebaseAuth类中没有方法可以帮助您根据电子邮件地址检查用户是否存在。如果您需要该功能,则必须自己创建。这意味着当用户首次登录应用时,请使用如下所示的模式将用户数据保存在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,则表示用户已经存在,否则不存在。

hts6caw3

hts6caw33#

如果要检查给定的电子邮件地址是否与Firebase中的用户配置文件相关联,可以调用fetchSignInMethodsForEmail API。
请注意,此API为恶意用户提供了一种执行所谓枚举攻击的方式,因此您现在实际上可以禁用fetchSignInMethodsForEmail-在这种情况下,从应用调用它将失败。
另见:

相关问题