当前位置: 首页 > 知识库问答 >
问题:

为什么电子邮件验证仍然存在,即使电子邮件被验证?

南宫博简
2023-03-14

我目前正在开发一个移动应用程序作为我最后一学期的项目。在我的移动应用程序中,我使用Firebase身份验证进行了此电子邮件验证。这是我执行此功能的教程(如果您感兴趣)。

Firebase登录

我这里的问题是,当我在我的移动应用程序中添加了重置密码功能(本教程的下一部分)时,即使电子邮件经过验证,电子邮件验证警报仍然存在。

设置活动(重置密码和电子邮件验证功能所在)

package com.example.biowit;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;

public class Settings extends AppCompatActivity {

Button Back_ST_btn, AboutUs_btn, VerEmail_btn, Res_Pass_btn, Con_Res_btn, Cancel_Res_btn;
TextView VerEmail_txt;
EditText NewPass_input, CoNewPass_input;
FirebaseAuth set_FbAuth;
FirebaseUser set_FbUser;
String respass_set, conpass_set;
// Switch Music_swch;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_settings);

    AboutUs_btn = findViewById(R.id.btn_AboutUs);
    Back_ST_btn = findViewById(R.id.btn_ST_Back);
    Res_Pass_btn = findViewById(R.id.btn_Reset_Pass);
    Con_Res_btn = findViewById(R.id.btn_Confirm_Reset);
    Cancel_Res_btn = findViewById(R.id.btn_Cancel_Reset);
    NewPass_input = findViewById(R.id.txt_New_Pass);
    CoNewPass_input = findViewById(R.id.txt_CoNew_Pass);
    VerEmail_btn = findViewById(R.id.btn_Verify_Email);
    VerEmail_txt = findViewById(R.id.lbl_Verify_Email);
    // Music_swch = findViewById(R.id.swch_ST_Music);.
    
    set_FbAuth = FirebaseAuth.getInstance();
    set_FbUser = set_FbAuth.getCurrentUser();


    Res_Pass_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            NewPass_input.setVisibility(View.VISIBLE);
            CoNewPass_input.setVisibility(View.VISIBLE);
            Con_Res_btn.setVisibility(View.VISIBLE);
            Cancel_Res_btn.setVisibility(View.VISIBLE);
        }
    });

    Cancel_Res_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            NewPass_input.setVisibility(View.GONE);
            CoNewPass_input.setVisibility(View.GONE);
            Con_Res_btn.setVisibility(View.INVISIBLE);
            Cancel_Res_btn.setVisibility(View.INVISIBLE);
        }
    });

    Con_Res_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            
            respass_set = NewPass_input.getText().toString();
            conpass_set = CoNewPass_input.getText().toString();

            if(respass_set.isEmpty()){ // condition if new password field is empty, error message will be shown.
                NewPass_input.setError("This field cannot be empty.");
                return;
            }

            if(conpass_set.isEmpty()){ // condition if confirm password field is empty, error message will be shown.
                CoNewPass_input.setError("This field cannot be empty.");
                return;
            }

            if (!conpass_set.equals(respass_set)){ // condition if the confirm password is not equals to new password, error message will be shown.
                CoNewPass_input.setError("Password does not match.");
                return;
            }

            set_FbUser.updatePassword(respass_set).addOnSuccessListener(new OnSuccessListener<Void>() {

                @Override
                public void onSuccess(Void unused) {

                    Toast.makeText(getApplicationContext(),"New Password saved.", Toast.LENGTH_LONG).show();
                    NewPass_input.setVisibility(View.GONE);
                    CoNewPass_input.setVisibility(View.GONE);
                    Con_Res_btn.setVisibility(View.INVISIBLE);
                }
            }).addOnFailureListener(new OnFailureListener() {

                @Override
                public void onFailure(@NonNull Exception e) {

                    Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
                }
            });
        }
    });

    //When email is not verified, a message and button will appear.
    if (!set_FbAuth.getCurrentUser().isEmailVerified()){

        VerEmail_txt.setVisibility(View.VISIBLE);
        VerEmail_btn.setVisibility(View.VISIBLE);
    }

    //When the "Verify Now" button is clicked, it will send a verification email to the user's email address.
    VerEmail_btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            //send verificaiton email
            set_FbAuth.getCurrentUser().sendEmailVerification().addOnSuccessListener(new OnSuccessListener<Void>() {

                @Override
                public void onSuccess(Void unused) {
                    Toast.makeText(getApplicationContext(),"Verification Email sent.", Toast.LENGTH_LONG).show();
                    VerEmail_txt.setVisibility(View.GONE);
                    VerEmail_btn.setVisibility(View.GONE);
                }
            });
        }
    });
    
    Back_ST_btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) { // returns to previous screen.

            finish();
        }
    });

    AboutUs_btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            startActivity(new Intent(getApplicationContext(), AboutUsScreen.class));
        }
    });
}

public void PlayBackgroundSound(View view){

    startService(new Intent(this, BgMusicService.class));
}

}

这是错误日志

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.biowit, PID: 7789
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.biowit/com.example.biowit.HomeScreen}: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.example.biowit/.BgMusicService }: app is in background uid UidRecord{964c600 u0a2 TPSL idle change:cached procs:1 seq(0,0,0)}
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3754)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3912)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2319)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:239)
    at android.app.ActivityThread.main(ActivityThread.java:8212)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:626)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1016)
 Caused by: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.example.biowit/.BgMusicService }: app is in background uid UidRecord{964c600 u0a2 TPSL idle change:cached procs:1 seq(0,0,0)}
    at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1758)
    at android.app.ContextImpl.startService(ContextImpl.java:1698)
    at android.content.ContextWrapper.startService(ContextWrapper.java:720)
    at android.content.ContextWrapper.startService(ContextWrapper.java:720)
    at com.example.biowit.HomeScreen.onCreate(HomeScreen.java:35)
    at android.app.Activity.performCreate(Activity.java:8119)
    at android.app.Activity.performCreate(Activity.java:8103)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1359)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3727)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3912) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2319) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:239) 
    at android.app.ActivityThread.main(ActivityThread.java:8212) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:626) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1016) 
Disconnected from the target VM, address: 'localhost:53820', transport: 'socket'

这是设置中的图片

我在这里用来登录的电子邮件在添加重置密码功能之前已经过验证。

如您所见,存在电子邮件验证警报。

共有1个答案

邵弘致
2023-03-14

用户对象被缓存,这包括验证的信息。正因为如此,你需要通知客户这些变化,用java这是通过一个任务来完成的

使用 sendEmailVerification() 方法,该方法作为用于异步发送电子邮件的任务返回,并报告状态。

例如:

final FirebaseUser user = mAuth.getCurrentUser();
        user.sendEmailVerification()
                .addOnCompleteListener(this, new OnCompleteListener() {
                    @Override
                    public void onComplete(@NonNull Task task) {
                        // Re-enable button
                        findViewById(R.id.verify_email_button).setEnabled(true);

                        if (task.isSuccessful()) {
                            Toast.makeText(EmailPasswordActivity.this,
                                    "Verification email sent to " + user.getEmail(),
                                    Toast.LENGTH_SHORT).show();
                        } else {
                            Log.e(TAG, "sendEmailVerification", task.getException());
                            Toast.makeText(EmailPasswordActivity.this,
                                    "Failed to send verification email.",
                                    Toast.LENGTH_SHORT).show();
                        }
                    }
                });

从mAuth.getCurrentUser()中检索用户,并在其上调用sendEmailVeration()方法。

您可以在此处找到完整的指南:https://firebase.googleblog.com/2017/02/email-verification-in-firebase-auth.html

 类似资料:
  • 我有一个关于firebase电子邮件验证工作的问题。 案例: 我的用户已登录我的网站(使用设备A)。 他们使用其他浏览器或设备(设备B)创建另一个帐户,但他们使用他已登录的浏览器和设备(设备A)打开电子邮件验证链接。 已经登录的用户(在设备A中)发生了什么?firebase是将它们签出还是只是验证新的电子邮件,但仍然与当前用户签入?

  • 我正在提示我的应用程序用户提供电子邮件凭据。 在用户插入电子邮件并通过后,我想验证该帐户。 我正在使用javax。邮政有没有办法验证帐户?只确保凭据确实有效——否则我想显示一个无效用户并传递消息。 也许是某种表演方式: 并在不发送任何内容的情况下检查身份验证异常。

  • 每当我在Firebase中使用电子邮件/密码身份验证提供程序时,提供程序都会在成功注册时发送一个无记名令牌,即使是。是否有一种开箱即用的方法将电子邮件/密码身份验证提供程序配置为在用户验证其电子邮件地址之前不发送无记名令牌(并返回403错误)? 请注意,我知道如何创建用户、登录用户、发送验证电子邮件等。。。使用firebase v9。x通过firebase/auth中的方法创建用户(使用Email

  • 问题内容: 我有这个EditText定义: 注意,EditText具有使用电子邮件地址规范定义的inputType。Android是否内置任何可验证电子邮件地址输入类型的内容,还是都必须手动完成?它允许我输入无效数据,所以我对它的用途感到好奇。 谢谢。 问题答案: 在这里,通过输入电子邮件类型,您可以将电子邮件类型的键盘设置为“ @”和“。”。关键字将显示在键盘上。 更好的解决方案是通过以下功能比

  • 我是Firebase的菜鸟。我要求一种设置电子邮件验证的分步指南。 目前,我的应用程序使用基本电子邮件密码登录。我希望对用户进行验证,以便根据用户的电子邮件验证属性隐藏内容。我正在调用.sendEmailVerification(),它会发送到当前用户的电子邮件,但是,每当我单击电子邮件中的链接时,它都说该链接已过期或有人已使用它,这也不会更改属性。我怀疑这与api管理器有关。我目前已将我的网站托

  • 我有一张登记表,上面有姓名、电子邮件和密码。注册时,会向用户的电子邮件地址发送一个确认链接。但在发送链接之前,我需要验证电子邮件地址。我使用了: 它显示的任何电子邮件都有效,例如, 我从获得的电子邮件并将其存储在中。 我到底要怎么做才能让它成功?