繁体   English   中英

如何检查手机是否存在于 firebase auth

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM