【问题标题】:Email verification for Firebase Auth UIFirebase 身份验证 UI 的电子邮件验证
【发布时间】:2020-08-30 02:45:46
【问题描述】:

我在一个安卓应用程序中使用firebase auth UI (FirebaseUI-Android),用户可以使用个人emailFacebooknumberGmail 帐户注册。我的问题是,当用户使用他的个人电子邮件 ID 注册时,我需要进行电子邮件验证。

    List<AuthUI.IdpConfig> providers = Arrays.asList(
        new AuthUI.IdpConfig.Builder(AuthUI.EMAIL_PROVIDER).build(),
        new AuthUI.IdpConfig.Builder(AuthUI.PHONE_VERIFICATION_PROVIDER).build(),
        new AuthUI.IdpConfig.Builder(AuthUI.FACEBOOK_PROVIDER).build(),
        new AuthUI.IdpConfig.Builder(AuthUI.GOOGLE_PROVIDER).build());

    startActivityForResult(
        AuthUI.getInstance()
                .createSignInIntentBuilder()
                .setIsSmartLockEnabled(true)
                .setTheme(R.style.GreenTheme)
                .setTosUrl("https://termsfeed.com/blog/terms-conditions-mobile-apps/")
                .setPrivacyPolicyUrl("https://superapp.example.com/privacy-policy.html")
                .setAvailableProviders(providers)
                .build(),
        RC_SIGN_IN);
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    // RC_SIGN_IN is the request code you passed into startActivityForResult(...) when starting the sign in flow.
    if (requestCode == RC_SIGN_IN) {
        IdpResponse response = IdpResponse.fromResultIntent(data);
        // Successfully signed in
        if (resultCode == RESULT_OK) {
            startActivity(new Intent(Login.this,MainActivity.class));
            finish();
            return;
        } else {
            // Sign in failed
            if (response == null) {
                Toasty.error(getApplicationContext(),"Sign in cancelled",Toast.LENGTH_SHORT, true).show();
                return;
            }

            if (response.getErrorCode() == ErrorCodes.NO_NETWORK) {
                Toasty.error(getApplicationContext(),"No internet connection",Toast.LENGTH_SHORT, true).show();
                return;
            }

            if (response.getErrorCode() == ErrorCodes.UNKNOWN_ERROR) {
                Toasty.error(getApplicationContext(),"Unkown Error",Toast.LENGTH_SHORT, true).show();
                return;
            }
        }
        Toasty.error(getApplicationContext(),"Unknown sign in response",Toast.LENGTH_SHORT, true).show();
    }
}  

这是我注册选项的意图。

【问题讨论】:

    标签: java android firebaseui


    【解决方案1】:

    你可以简单地做如下,

    1. 获取当前 Firebase 用户实例,

      final FirebaseUser currentUser = mAuth.getCurrentUser();
      
    2. 检查provider是否为password表示使用的登录方式为Email Auth

      if(null != currentUser) {
          if("password".equals(currentUser.getProviderData().get(0).getProviderId())) {
              /* Handle Verification */
          }
      }
      

      参考链接https://firebase.google.com/docs/reference/android/com/google/firebase/auth/EmailAuthProvider#PROVIDER_ID

    3. 检查用户是否已通过验证,

      currentUser.isEmailVerified();
      
    4. 如果用户未通过验证,则可以使用以下代码发送验证电子邮件,

      if (!currentUser.isEmailVerified()) {
          /* Do Something */
      }
      
      /* Send Verification Email */
      currentUser.sendEmailVerification()
              .addOnCompleteListener(this, new OnCompleteListener() {
                  @Override
                  public void onComplete(@NonNull Task task) {
                      /* Check Success */
                      if (task.isSuccessful()) {
                          Toast.makeText(getApplicationContext(),
                                  "Verification Email Sent To: " + currentUser.getEmail(),
                                  Toast.LENGTH_SHORT).show();
                      } else {
                          Log.e(TAG, "sendEmailVerification", task.getException());
                          Toast.makeText(getApplicationContext(),
                                  "Failed To Send Verification Email!",
                                  Toast.LENGTH_SHORT).show();
                      }
                  }
              });
      

    一旦你准备好所有的部分,最终的代码 sn-p 应该如下所示:

    最终代码片段:

    if (requestCode == RC_SIGN_IN) {
        IdpResponse response = IdpResponse.fromResultIntent(data);
    
        /* Success */
        if (resultCode == RESULT_OK) {
            final FirebaseUser currentUser = mAuth.getCurrentUser();
    
            if(null != currentUser) {
                if("password".equals(currentUser.getProviderData().get(0).getProviderId())) {
                    if(!currentUser.isEmailVerified()) {
                        /* Send Verification Email */
                        currentUser.sendEmailVerification()
                            .addOnCompleteListener(this, new OnCompleteListener() {
                                @Override
                                public void onComplete(@NonNull Task task) {
                                    /* Check Success */
                                    if (task.isSuccessful()) {
                                        Toast.makeText(getApplicationContext(),
                                                "Verification Email Sent To: " + currentUser.getEmail(),
                                                Toast.LENGTH_SHORT).show();
                                    } else {
                                        Log.e(TAG, "sendEmailVerification", task.getException());
                                        Toast.makeText(getApplicationContext(),
                                                "Failed To Send Verification Email!",
                                                Toast.LENGTH_SHORT).show();
                                    }
                                }
                            });
    
                        /* Handle Case When Email Not Verified */
                    }
                }
    
                /* Login Success */
                startActivity(new Intent(Login.this, MainActivity.class));
                finish();
                return;
            }
        } else {
            /* Handle Failure */
        }
    }
    

    【讨论】:

    • 你能告诉我代码在我的代码中的确切位置吗?
    • @ravi 登录后,即resultCode == RESULT_OK,您首先必须检查Provider Id 中的currentUser。如果Provider Id 表示登录方法是Email,那么您将检查用户是否已通过验证。如果没有,您可以使用上面的代码 sn-p 发送一封电子邮件,并显示一个 toast 指示该帐户需要验证。
    • currentUser.getProviderData().get(0).getProviderId() return 'firebase'
    【解决方案2】:

    @user2004685 上面的回答给出了很好的提示。但它至少对最新的 firebase-ui 不起作用,因为 currentUser.getProviderData().get(0).getProviderId() 返回 'firebase'。

    所以更新的解决方案是

    
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    
      if (requestCode == RC_SIGN_IN) {
        IdpResponse response = IdpResponse.fromResultIntent(data);
    
        /* Success */
        if (resultCode == RESULT_OK) {
            final FirebaseUser currentUser = mAuth.getCurrentUser();
    
            if(null != currentUser) {
                if(currentUser.getEmail()!=null) {
                    if(!currentUser.isEmailVerified()) {
                        /* Send Verification Email */
                        currentUser.sendEmailVerification()
                            .addOnCompleteListener(this, new OnCompleteListener() {
                                @Override
                                public void onComplete(@NonNull Task task) {
                                    /* Check Success */
                                    if (task.isSuccessful()) {
                                        Toast.makeText(getApplicationContext(),
                                                "Verification Email Sent To: " + currentUser.getEmail(),
                                                Toast.LENGTH_SHORT).show();
                                    } else {
                                        Log.e(TAG, "sendEmailVerification", task.getException());
                                        Toast.makeText(getApplicationContext(),
                                                "Failed To Send Verification Email!",
                                                Toast.LENGTH_SHORT).show();
                                    }
                                }
                            });
    
                        /* Handle Case When Email Not Verified */
                    }
                }
    
                /* Login Success */
                startActivity(new Intent(Login.this, MainActivity.class));
                finish();
                return;
            }
        } else {
            /* Handle Failure */
        }
      }
    }
    

    只需将if("password".equals(currentUser.getProviderData().get(0).getProviderId())) 替换为if(currentUser.getEmail()!=null)

    【讨论】:

      猜你喜欢
      • 2018-02-10
      • 2023-03-18
      • 2021-03-26
      • 2018-09-17
      • 2019-07-13
      • 2020-11-22
      • 2019-05-20
      • 2021-11-21
      • 2021-10-05
      相关资源
      最近更新 更多