我正在尝试检查Firebase身份验证中是否已存在电子邮件,但我可以找到Java的一些内容。我正在尝试执行类似于在电子邮件列表中搜索的操作,如果该电子邮件不在数据库中(emailNotExistsInDatabase(email)),则继续。
68bkxrlz1#
除了Alex非常完整的响应之外,另一种可能的方法是使用从应用调用的Callable Cloud Function。由于我们在Cloud Functions中使用Admin SDK,因此您可以使用getUserByEmail()方法。函数如下所示:
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()方法。
jk9hmnmh2#
FirebaseAuth类中没有方法可以帮助您根据电子邮件地址检查用户是否存在。如果您需要该功能,则必须自己创建。这意味着当用户首次登录应用时,请使用如下所示的模式将用户数据保存在Firestore中:
db | --- users (collection) | --- $uid (document) | --- email: "user-email@gmail.com"
要检查使用user-email@gmail.com的用户是否已经存在,您必须执行一个查询,在Java中如下所示:
user-email@gmail.com
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,则表示用户已经存在,否则不存在。
hts6caw33#
如果要检查给定的电子邮件地址是否与Firebase中的用户配置文件相关联,可以调用fetchSignInMethodsForEmail API。请注意,此API为恶意用户提供了一种执行所谓枚举攻击的方式,因此您现在实际上可以禁用fetchSignInMethodsForEmail-在这种情况下,从应用调用它将失败。另见:
fetchSignInMethodsForEmail
3条答案
按热度按时间68bkxrlz1#
除了Alex非常完整的响应之外,另一种可能的方法是使用从应用调用的Callable Cloud Function。
由于我们在Cloud Functions中使用Admin SDK,因此您可以使用
getUserByEmail()
方法。函数如下所示:
使用这种方法,你不需要一个特定的Firestore集合,Admin SDK将直接查询Auth服务。
有关如何从应用调用可调用云函数的说明,请参阅文档。
请注意,如果您想从应用程序(例如Android应用程序)中检查用户是否存在,上述方法是有效的。
如果已经使用了the Admin SDK from a Java based server,则只需在服务器代码中使用
getUserByEmail()
方法。jk9hmnmh2#
FirebaseAuth类中没有方法可以帮助您根据电子邮件地址检查用户是否存在。如果您需要该功能,则必须自己创建。这意味着当用户首次登录应用时,请使用如下所示的模式将用户数据保存在Firestore中:
要检查使用
user-email@gmail.com
的用户是否已经存在,您必须执行一个查询,在Java中如下所示:另一个解决方案是使用Query#count()方法:
如果结果〉0,则表示用户已经存在,否则不存在。
hts6caw33#
如果要检查给定的电子邮件地址是否与Firebase中的用户配置文件相关联,可以调用
fetchSignInMethodsForEmail
API。请注意,此API为恶意用户提供了一种执行所谓枚举攻击的方式,因此您现在实际上可以禁用
fetchSignInMethodsForEmail
-在这种情况下,从应用调用它将失败。另见: