![](/img/trans.png)
[英]How to check if a user already exists in a Firestore collection after signing in with Firebase Auth in SwiftUI
[英]how to check if phone exists in firebase auth
嘿,我尝试检查我的 firebase 身份验证(LoginActivity)中是否存在用户插入的电话号码,我以这种方式尝试
String phoneNumber = "+1234567890";
mAuth.fetchSignInMethodsForEmail(phoneNumber)
.addOnCompleteListener(new OnCompleteListener<SignInMethodQueryResult>() {
@Override
public void onComplete(@NonNull Task<SignInMethodQueryResult> task) {
if (task.isSuccessful()) {
SignInMethodQueryResult result = task.getResult();
List<String> signInMethods = result.getSignInMethods();
if (signInMethods.contains("phone")) {
// Phone number is already in use in Firebase Auth
} else {
// Phone number is not in use in Firebase Auth
}
} else {
// An error occurred
}
}
});
当涉及到这个 function 时,调试器会跳转到它并且不做任何事情。addOnCompleteListener(new OnCompleteListener() {
我尝试使用 firebase sdk 管理员,但它也不起作用有人知道如何解决这个问题吗?
您可以通过三种方式解决此问题。 客户端有两个选项,使用 Java 代码,另一个使用管理员 SDK。
解决方案 1
当用户首次登录您的应用时,使用如下所示的架构将用户数据保存在Firestore中:
db
|
--- users (collection)
|
--- $uid (document)
|
--- phoneNumber: "+1234567890"
要检查+1234567890
的用户是否已经存在,那么您必须在 Java 中执行如下所示的查询:
FirebaseFirestore db = FirebaseFirestore.getInstance();
Query queryPhoneNumber = db.collection("users").whereEqualTo("phoneNumber", "+1234567890");
queryPhoneNumber.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()方法:
queryPhoneNumber.count();
如果结果 > 0 则表示该用户已经存在,否则不存在。
解决方案 3
最后一个解决方案是使用可从您的应用程序调用的Callable Cloud Function 。 因为我们在 Cloud Functions 中使用 Admin SDK,所以您可以调用getUserByPhoneNumber()方法。 在代码中它看起来像这样:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
exports.checkPhoneNumberExists = functions.https.onCall((data, context) => {
return admin.auth()
.getUserByPhoneNumber(data.phoneNumber)
.then((userRecord) => {
return { phoneNumber: true }
})
.catch((error) => {
throw new functions.https.HttpsError('invalid-argument', "phoneNumber doesn't exist");
});
});
使用这种方法,无需在 Firestore 中保存用户数据。 Admin SDK会直接查询FirebaseAuth服务。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.