首页 > 解决方案 > Firebase 动态链接(创建控制台)是否支持使用 ActionCodeSettings 和密码重置的自定义查询参数?

问题描述

有没有办法在使用控制台创建的 Firebase 动态链接中传递自定义查询参数?

我的工作流程如下:

  1. 接收电子邮件并执行的“重置密码”屏幕sendPasswordResetEmail(email, settings)

  2. 转到电子邮件并选择打开应用程序以重置密码的链接:https ://xxxxx.page.link?link=https://xxxx-00000.firebaseapp.com/__/auth/action?apiKey%3DAIzaSyDxTJUhYNwbMpoRhRWde74tAqV0CMKHh_o%26mode %3DresetPassword%26oobCode%3DccgIWg7D-FPtRTp2OXon8UaIB1AL0_qpktnAL--P-eMAAAFsgjDmkw%26continueUrl%3Dhttps://example.com/%26lang%3Den&apn=com.example&amv

  3. 应用程序启动,我们进入屏幕输入新密码。

  4. 称呼FirebaseDynamicLinks.getInstance().getDynamicLink(getIntent())

  5. 用于pendingDynamicLinkData.getLink().getQueryParameter("oobCode"));从动态链接获取查询参数(在本例中获取我们用于重置密码的密码代码。

  6. 在上一步中使用 oobCode 并调用FirebaseAuth.getInstance().confirmPasswordReset(actionCode, password)按钮单击(从使用输入的 editText 字段中获取密码)以重置密码。

理想情况下,我想在密码重置后登录我的用户。为此,我需要在密码重置中使用电子邮件地址(我需要从尝试登录的用户那里获取 firestore 文档信息)。

所以我需要能够将电子邮件地址传递到屏幕以重置密码。

这是我的相关代码片段:

初始“忘记密码屏幕”:用户在此处输入电子邮件。首先构建我的操作代码设置,然后执行 sendPasswordResetEmail() 方法。

String url = "https://example.com"; //my deep link set in Firebase console
        ActionCodeSettings settings = ActionCodeSettings.newBuilder()
                .setAndroidPackageName(
                        getPackageName(),
                        true, /* install if not available? */
                        null   /* minimum app version */)
                .setHandleCodeInApp(true)
                .setUrl(url)
                .build();

 mAuth.sendPasswordResetEmail(email, settings)
                .addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        if (task.isSuccessful()) {
                            Log.d(TAG, "Email sent.");
                        }
                        else {
                            Exception e = task.getException();
                            Log.w(TAG, "passwordResetRequest:failure " + e.getMessage(), task.getException());
                            if (e instanceof FirebaseAuthInvalidCredentialsException) {
                            }
                        }
                    }
                });

然后在电子邮件中选择链接后,我们进入重置密码屏幕。在这里,我们调用以下方法从动态链接中获取参数:

FirebaseDynamicLinks.getInstance()
                .getDynamicLink(getIntent())
                .addOnSuccessListener(this, new OnSuccessListener<PendingDynamicLinkData>() {
                    @Override
                    public void onSuccess(PendingDynamicLinkData pendingDynamicLinkData) {
                        // Get deep link from result (may be null if no link is found)
                        Uri deepLink = null;
                        if (pendingDynamicLinkData != null && pendingDynamicLinkData.getLink() != null) {
                            deepLink = pendingDynamicLinkData.getLink();
                            actionCode = deepLink.getQueryParameter("oobCode");
                            actionMode = deepLink.getQueryParameter("mode");
                        }
                    }
                })
                .addOnFailureListener(this, new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.w(TAG, "getDynamicLink:onFailure", e);
                    }
                });

最后,我们使用 oobCode(允许重置密码的操作代码),在按钮单击和用户输入新密码时,我们使用以下命令重置密码:

resetPass.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (actionCode != null && !actionCode.equals(""))
                FirebaseAuth.getInstance().confirmPasswordReset(actionCode, newPassword.getText().toString()).addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        if (task.isSuccessful() && task.getResult() != null)
                            Log.d(TAG, "Deep Link confirmPassReset: " + task.getResult().toString());
                    }
                });
            }
        });

这就是我挣扎的地方。在构建ActionCodeSettings. 例如: String url = "https://example.com/?email=jsmith@gmail.com"; 然后尝试使用以下方法在重置密码屏幕中获取它们: deepLink.getQueryParameter("email"); 但是每次我尝试这个时,我都会不断得到null. 我错过了什么。甚至可以使用在 Firebase 控制台中创建的动态链接传递自定义查询参数吗?如果没有,实现这一目标的最佳方法是什么?

任何帮助将不胜感激。提前致谢!

标签: androidfirebasefirebase-authenticationfirebase-dynamic-links

解决方案


您需要先获取链接

val actionUrl = deepLink.getQueryParameter("continueUrl")

并使用 subString 获取电子邮件值

actionUrl.substring(actionURL.lastIndexOf("=") + 1, actionURL.length)

推荐阅读