![](/img/trans.png)
[英]Firebase Authentication ( Email & Password ) how to check existing user
[英]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.