【问题标题】:Firebase Phone VerifiedFirebase 电话已验证
【发布时间】:2019-10-11 22:16:32
【问题描述】:

Firebase 中是否有方法可以调用以检查用户是否已验证电话号码?我已经一切正常(用户输入国家代码/电话号码,自动输入 OTP 代码并开始正确的活动),但我想检查用户是否已验证电话号码,以防他没有我想要禁止他访问某些活动。

对于电子邮件,有isEmailVerified(),但对于电话验证,只有getPhoneNumber 方法。

【问题讨论】:

  • 快速提问:如果用户下载应用、登录、验证手机号码、卸载应用然后重新安装,是否还需要验证手机号码?
  • @TaslimOseni 我不确定,取决于我将信息保存在哪里(后端或 sharedpref),但仍在寻找更优雅的解决方案

标签: android firebase firebase-authentication


【解决方案1】:

如果一切正常,这意味着用户有一个经过验证的手机,它应该是一个公理:“如果用户通过了注册电话活动,这意味着他的手机已经通过验证,所以你不需要再次检查这个。”。

如果您确实需要检查手机是否已通过验证,则必须手动完成,如果您仅使用 Firebase 作为后端,则需要保存每部手机(例如:“+2136xxxxxx”:“true”) )。

如果您使用另一个后端 SQL,您可以创建一个表 user 并在需要时更新它的列 phoneIsVerified

【讨论】:

  • 我明白,默认情况下,每个成功的电话身份验证都会被验证,但目标是禁止用户访问某些活动,除非他已经验证了电话号码。手动操作似乎不是我希望的优雅解决方案。想知道在这里可以应用 SharedPreferences 吗?任何建议从这里下一步去哪里都是非常受欢迎的。
  • 是的,我明白了,但是如果您使用 SharedPreferences 然后用户清除应用程序缓存/数据。你会丢失信息。我认为最好的解决方案是我建议将信息保存在您的后端。您可以将有关手机的信息保存在 SharedPref 中,仅用于优化(避免每次调用后端)。但不是永久信息,因为缓存会删除此信息。
【解决方案2】:

您可以通过 - 来检查 userId 或 phone number 是否为空

FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();

if(firebaseUser.getUid() == null || firebaseUser.getPhoneNumber() == null){
    // User is not logged in
}

已编辑

如果您希望您的用户通过电话验证再次登录,您可以使用 -

注销您的用户
if(firebaseUser.getUid() != null){
     // User is logged in
     FirebaseAuth.getInstance().signOut();
}

【讨论】:

  • 即使我没有验证电话号码,我也可以通过 if 循环和打开活动。
  • 没有太多要显示的代码,出于测试目的,我只是使用按钮和 onClickListener 来检查用户是否已验证电话号码。它仅在第一次打开时阻止打开活动(不知道为什么),但在下次打开应用程序时,即使我没有经过验证的电话号码,它也会打开活动。
  • 编辑了我的答案。您可以在用户打开应用程序时使用注销,然后要求用户再次登录@byteme
【解决方案3】:

我不确定您的应用程序的流程,但据我了解:用户无需经过身份验证即可使用您的应用程序。但是,您希望未经身份验证的用户只能访问有限数量的功能

您在 cmets 中提到,用户在每次全新安装应用时都必须验证其电话号码,无论之前是否使用过。因此,您可以像这样使用 SharedPreferences 来发挥自己的优势:

  • 每次用户验证他们的电话号码时,将布尔值 (true) 保存到 SharedPreferences。
  • 当用户想要访问仅对经过身份验证的用户可用的功能时,请检查保存的 SharedPreferences 布尔值以检查用户是否经过身份验证。
  • 当用户退出时,记得删除/重置 SharedPreferences 布尔值。

要将布尔值保存到 SharedPreferences,您可以执行以下操作:
// create a SharedPreferences object and reference it with "AUTH_STATUS"
SharedPreferences sharedPreferences = getSharedPreferences("AUTH_STATUS", Context.MODE_PRIVATE);

// create an editor object from your sharedpreferences object
SharedPreferences.Editor editor = sharedPreferences.edit();

// save your boolean value to a reference called "status"
editor.putBoolean("status", true);

// save changes
editor.apply();

要检索保存的布尔值,您可以执行以下操作:

// create a SharedPreferences object and reference it with "AUTH_STATUS"
SharedPreferences sharedPreferences = getSharedPreferences("AUTH_STATUS", Context.MODE_PRIVATE);

// get saved boolean value, default value should be false
boolean ab  = sharedPreferences.getBoolean("status", false);

要删除/重置 SharedPreferences 布尔值,只需将布尔值设置为 false,如下所示:

// create a SharedPreferences object and reference it with "AUTH_STATUS"
SharedPreferences sharedPreferences = getSharedPreferences("AUTH_STATUS", Context.MODE_PRIVATE);

// create an editor object from your sharedpreferences object
SharedPreferences.Editor editor = sharedPreferences.edit();

// save your boolean value to a reference called "status"
editor.putBoolean("status", false);

// save changes
editor.apply();

【讨论】:

    【解决方案4】:

    根据我在tutorial video 中使用的代码,user.getPhoneNumber() 如果未经验证,将不包含任何数字。 它甚至不会出现在 Firebase 网站的身份验证列表中。

    鉴于这些知识,我不仅检查 user.getPhoneNumber() 是否为 null,我还检查 user.getPhoneNumber() 不包含“+”(因为如果它包含“+”表示有一个经过验证的电话号码)。

    以下代码有助于解决“电子邮件已验证?”和“电话号码已验证?”难题。

    FirebaseAuth mAuth = FirebaseAuth.getInstance();
    FirebaseUser user = mAuth.getCurrentUser();
    
    if (user != null &&
    (user.getPhoneNumber() == null ||
    (user.getPhoneNumber() != null && 
    !user.getPhoneNumber().contains("+")))
    ) {
       if (!user.isEmailVerified()) {
       verifyMsg.setVisibility(View.VISIBLE);
       editor.putString("capturegoogleloginonetime", "1");
       editor.apply();
       resendCode.setVisibility(View.VISIBLE);
    
       resendCode.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {
                 //send verification link
                 FirebaseUser fuser = mAuth.getCurrentUser();
                                    
                 user.sendEmailVerification().addOnSuccessListener(new 
                 OnSuccessListener<Void>() {
                      @Override
                      public void onSuccess(Void aVoid) {
                      Toast.makeText(v.getContext(), "Verification Email has been Sent.",
                      Toast.LENGTH_SHORT).show();
                      }
    
                 }).addOnFailureListener(new OnFailureListener() {
                      @Override
                      public void onFailure(@NonNull Exception e) {
                      Toast.makeText(LoginActivity.this, 
                      "Error: Email not sent " + e.getMessage(),
                      Toast.LENGTH_SHORT).show();
                      }
                    });
                   }
                 });
                }
               }
        
    if (user != null && user.getPhoneNumber() != null 
    && user.getPhoneNumber().contains("+")) {
       SendUserToMainActivity();
    }
    
    if (user != null && user.isEmailVerified() ) {
       SendUserToMainActivity();
    }
    

    【讨论】:

      猜你喜欢
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      • 2018-05-17
      • 2018-12-14
      • 2021-03-10
      • 2021-06-10
      相关资源
      最近更新 更多