繁体   English   中英

Firebase 身份验证 UI 的电子邮件验证

[英]Email verification for Firebase Auth UI

我在一个 android 应用程序中使用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();
    }
}  

这是我对注册选项的意图。

在此处输入图片说明

你可以简单地做如下,

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

     final FirebaseUser currentUser = mAuth.getCurrentUser();
  2. 检查提供者是否是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(); } } });

完成所有部分后,最终的代码片段应如下所示:

最终代码片段:

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 */
    }
}

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

所以更新的解决方案是


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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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