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

Firebase 用户:isEmailVerified 返回 false

朱炳
2023-03-14

我正在开发一个使用Firebase身份验证的Android应用程序。创建新用户后,我会发送一封验证电子邮件。

Firebase.auth.currentUser?.let {user ->
        user.sendEmailVerification().addOnCompleteListener {verificationTask ->
            if(verificationTask.isSuccessful){
                _verificationSuccess.value = true
            } else {
                _verificationError.value = verificationTask.exception
            }
        }
    }

在我的清单中,我添加了一个Intent过滤器,当用户尝试打开验证链接时打开我的应用。

<intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <data
                    android:host="test-project.firebaseapp.com"
                    android:scheme="https"/>
            </intent-filter>

问题是,当链接打开我的应用程序时,电子邮件没有得到验证。我有一个总是返回false的验证

if(Firebase.auth.currentUser.isEmailVerified){
                        //Email verified
                    } else {
                        throw Exception("Email not verified")
                    }

只有在Web资源管理器中打开验证链接时,验证才会返回true。如何验证应用内的电子邮件?

共有1个答案

葛哲彦
2023-03-14

通过应用您拥有的意图过滤器,您已经告诉Android,您将处理所有针对 https://test-project.firebaseapp.com Web请求。现在,您的应用程序已捕获浏览到此 URL,您现在需要代表用户向服务器发出请求。

默认情况下,当您向用户发送电子邮件验证时,他们将收到一封电子邮件,其中包含如下链接:

https://<PROJECT_ID>.firebaseapp.com/__/auth/action?mode=verifyEmail&oobCode=<VERIFICATION_CODE>&apiKey=<API_KEY>&lang=<LANGUAGE>

注意:可以使用自定义操作处理程序自定义这些链接,也可以使用动态链接,这样就不会截获指向<code>的所有内容https://test-project.firebaseapp.com。

因为用户可能希望在浏览器中访问您的应用程序网站,所以您应该让您的意图过滤器更具体地处理电子邮件操作。

<intent-filter android:label="@string/filter_view_handle_action_code">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="https"
          android:host="test-project.firebaseapp.com"
          android:pathPrefix="/__/auth/action" />
</intent-filter>

免责声明:我没有测试过下面的方法是否有效,但是理论上应该可以。

如果您拦截了这样一个URL,则需要在onCreate方法中处理它:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Intent intent = this.getIntent();
    if (intent.hasCategory(android.intent.category.BROWSABLE)) {
        // intent came from browser
        Uri data = intent.getData();
        String mode = data.getQueryParameter("mode");
        String oobCode = data.getQueryParameter("oobCode");
        if (mode != "verifyEmail" || oobCode == null) {
            Log.i("MyActivity", "Started with unexpected browsable intent");
            return;
        }

        handleVerifyEmailActionCode(oobCode);
    }
}

private handleVerifyEmailActionCode(String oobCode) {
    String email = null;
    FirebaseAuth.getInstance().checkActionCode(oobCode)
        .onSuccessTask( actionCodeResult -> {
            if (actionCodeResult.getOperation() != ActionCodeResult.VERIFY_EMAIL) {
                throw new UnsupportedActionCodeOperationException(actionCodeResult.getOperation());
            }

            email = actionCodeResult.getInfo().getEmail();
            return FirebaseAuth.getInstance().applyActionCode(oobCode);
        })
        .addOnCompleteListener( applyActionCodeTask -> {
            if (!applyActionCodeTask.isSuccessful()) {
                Exception ex = applyActionCodeTask.getException();
                // TODO: Handle exceptions
                Toast.makeText(getApplicationContext(), "Failed to verify email. " + ex.getMessage(), Toast.LENGTH_SHORT).show();
                return;
            }

            // email verified successfully!
            // do something interesting
            Toast.makeText(getApplicationContext(), email + " was verified!", Toast.LENGTH_SHORT).show();
            FirebaseUser user = FirebaseAuth.getCurrentUser(); // WARN: May not have finished initializing yet?
            if (user != null && user.getEmail() == email) {
                user.reload()
                    .addOnFailureListener(ex -> {
                        Log.e(MyActivity.class, "Failed to refresh user token: " + ex.getMessage());
                    });
            } else {
                Log.i(
                    MyActivity.class,
                    user == null
                        ? "User wasn't signed in, skipping reload"
                        : "User email mismatch, skipping reload"
                );
            }
    });
}
/**
 * Custom exception to be used when a OOB code's `ActionCodeResult.Operation`
 * doesn't match what it was expected to be.
 * 
 * @see https://firebase.google.com/docs/reference/android/com/google/firebase/auth/ActionCodeResult#constant-summary
 */
public class UnsupportedActionCodeOperationException extends Exception { 
    protected int operation;

    public UnsupportedActionCodeOperationException(int operation) {
        super("The ActionCodeResult.Operation value of " + operation + " is not supported");
        this.operation = operation;
    }

    public int getOperation() {
        return this.operation;
    }
}
 类似资料:
  • 我正在检测电子邮件是否通过标题上显示的指令与fire base进行验证,并且它可以工作,但有一个奇怪的错误。 第一次尝试验证邮件时,即使已验证,也会显示未验证。当方法再次被执行时,它返回它已被验证。 我已经检查过了,这不是时间问题,即使我从验证邮件的那一刻到我告诉应用程序检查它是否被验证的那一刻离开了很长时间,它总是在第一次尝试时失败。 我该怎么办,如果电子邮件被验证,它返回说,它是从第一次尝试验

  • 当使用signInWithEmailAndPassword()API在firebase中进行身份验证时,我无法获得有效的“当前”用户。 我使用用户名和密码登录应用程序 我一旦登录,用户就会被带到主页 我试图获取用户的UID,但是没有返回有效的用户。调用发生在异步函数中,如下所示: 当前用户为空。 知道是什么引起的吗?

  • 我想在创建新用户时添加用户的DisplayName。当我尝试使用updateProfile方法时,它会发出以下警告 ///更新用户的配置文件数据。 @已弃用('将在版本2.0.0中删除。''改用updatePhotoURL和updateDisplayName。', 你怎么能避开这个?? flutter: User(显示名称:null,电子邮件:test1@gmail.com,emailVerifi

  • 这是关于Flutter Firebase认证插件。< br >我试图在创建新用户后发送验证电子邮件,但sendEmailVerification()在内部使用currentUser()。这在我看来像是一个bug,但为了以防万一,我向stackoverflow提出了一个问题。错误在Android和IOS上是一样的。< br > 前两行返回Firebase User。第三个返回null。第四,如果第三

  • 我尝试使用Firebase实时数据库进行登录活动。 我的数据库在注册时填写如下: 登录后,我想初始化一个公共静态用户,这样我就可以在我的主要活动中检索它并相应地更新用户界面,但是ValueEventListener的dataSnapshop返回null。 以下是我的addListenerForSingleValueEvent的代码: 任何人都有办法帮助我。或者有什么解决方法或建议可以做得更好? 编

  • 不确定我是否做错了什么,但使用此apihttps://www.firebase.com/docs/security/simple-login-email-password.html根据返回消息,我可以成功创建一个用户,但在Forge控制台的任何地方都看不到该用户。您如何知道注册了哪些用户? 我应该使用返回的用户ID并在Firebase中创建自己的用户对象,还是不需要进行此复制。我确实需要添加一些额