【问题标题】:How to check if a user already exists in firebase during phone auth如何在电话身份验证期间检查用户是否已存在于 Firebase 中
【发布时间】:2018-11-09 22:27:59
【问题描述】:

我正在尝试创建一个仅使用来自 firebase 的电话授权的应用。由于登录/注册是通过相同的过程完成的,即验证发送的代码。如何检查用户是否已存在于 Firebase 中?我需要这个来向他们展示适当的用户界面。

【问题讨论】:

  • 说实话,我不明白这个问题。如果用户已经登录,则清楚该做什么。如果他打开新的应用程序并且没有登录,他无论如何都需要重新输入他的电话号码以进行身份​​验证。所以两者之间没有真正的区别。您需要知道他的凭据(例如他的电话号码)才能知道他是否存在。但是,如果他提供了号码,您就可以立即让他登录?
  • 假设用户首次启动该应用并通过验证其号码进行注册。然后向他展示查询姓名/电子邮件等以完成注册的活动(我们称之为 X)。当他注销时,下次他想使用该应用程序时,他必须通过相同的电话验证过程重新进行身份验证。然而这一次他不应该被展示X活动对吧?这就是问题所在。由于我无法确定这是新用户还是已经注册,所以我不知道如何跳过那些只是登录的用户的 X 活动。
  • 你要创建用户吗?您将授予他们什么权限?并且要创建用户,您的应用程序需要相当高的权限,这对安全性不利,因为如果您犯了一个错误,如果您有很多人,您可能会丢失所有基础的整个数据库。

标签: java android firebase firebase-authentication


【解决方案1】:

目前,唯一的方法是通过 Firebase Admin SDK。 lookup a user by phone number 有一个 API。

admin.auth().getUserByPhoneNumber(phoneNumber)
  .then(function(userRecord) {
    // User found.
  })
  .catch(function(error) {
    console.log("Error fetching user data:", error);
  });

【讨论】:

  • 感谢您的回答,这看起来像是合法的方法。在等待回复的同时,我试图自己弄清楚事情,并决定检查用户的数据是否已经存在于 Firestore 云中并且运行良好。
  • @bojeil 我很困惑将这个 serviceAccountKey.json 文件放在哪里,然后设置它的路径,我正在使用 android studio
  • 不要在您的 android 应用中使用 Admin SDK API。这应该只从安全的服务器上运行。服务帐户不应暴露给客户端,否则您的用户及其数据将受到损害。
  • @bojeil 我也有同样的问题。如果我们在我们的应用程序中不使用 admin SDK,我们将如何检查电话帐户是否已经存在?如果不在应用程序中,我很困惑我们在哪里运行此代码。
  • @Karen 您可以将其作为托管函数运行,并从您的应用程序对其进行 API 调用。这样,您只会向您的应用程序公开单个功能,而不是整个 admin sdk
【解决方案2】:

您可以通过比较元数据来检查用户是否已存在于 Firebase 中。见代码示例:

PhoneAuthCredential phoneAuthCredential = PhoneAuthProvider.getCredential(verificationId, smsCode);
            FirebaseAuth.getInstance().signInWithCredential(phoneAuthCredential).addOnCompleteListener(PhoneLoginEnterCodeActivity.this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task){
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        FirebaseUser user = task.getResult().getUser();
                        long creationTimestamp = user.getMetadata().getCreationTimestamp();
                        long lastSignInTimestamp = user.getMetadata().getLastSignInTimestamp();
                        if (creationTimestamp == lastSignInTimestamp) {
                            //do create new user
                        } else {
                           //user is exists, just do login
                        }
                    } else {
                        // Sign in failed, display a message and update the UI
                        if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
                            // The verification code entered was invalid
                        }
                    }
                }
            });

【讨论】:

    【解决方案3】:

    有一个additionalUserInfo 属性,您可以像这样查询(Kotlin):

    firebaseAuth.signInWithCredential(credential)
        .addOnCompleteListener {
            it.result.additionalUserInfo?.isNewUser // new user check
        }
    

    如果我借用@Eltanan Derek 代码:

    PhoneAuthCredential phoneAuthCredential = PhoneAuthProvider.getCredential(verificationId, smsCode);
                FirebaseAuth.getInstance().signInWithCredential(phoneAuthCredential).addOnCompleteListener(PhoneLoginEnterCodeActivity.this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task){
                        if (task.isSuccessful()) {
                            // Sign in success, update UI with the signed-in user's information
                            FirebaseUser user = task.getResult().getUser().getAdditionalUserInfo();
                            
                            if (user.isNewUser()) {
                                //do create new user
                            } else {
                               //user is exists, just do login
                            }
                        } else {
                            // Sign in failed, display a message and update the UI
                            if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
                                // The verification code entered was invalid
                            }
                        }
                    }
                });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-11
      • 2019-02-22
      • 2020-08-18
      • 1970-01-01
      • 2019-01-03
      • 2022-06-30
      • 2023-01-23
      • 1970-01-01
      相关资源
      最近更新 更多