如何检查电话是否存在于firebase身份验证中

6rqinv9w  于 2023-01-31  发布在  其他
关注(0)|答案(1)|浏览(174)

嘿,我试着检查用户插入的电话号码是否存在于我的firebase auth(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
                }
            }
        });

当它到达这个函数时,调试器跳转到它,并且不做任何事情。addOnCompleteListener(new OnCompleteListener(){
我尝试与firebase的sdk管理,它也不工作,有人知道如何解决这个问题吗?

hiz5n14c

hiz5n14c1#

有三种方法可以解决这个问题。两种方法是在客户端使用Java代码,另一种方法是使用Admin 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!
        }
    }
});
    • 溶液2**

另一个更优雅、更简单的解决方案是使用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服务。

相关问题