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

Firebase动态链接:在ActionCodeSettings(continue URL)不工作的情况下重置密码

屈翰飞
2023-03-14

这件事我已经绞尽脑汁好几个星期了。我有麻烦得到一个自定义密码重置,让用户重置他们的应用程序内的密码。

到目前为止,我能够做到以下几点:

  1. 发送密码重置电子邮件。
  2. 当用户单击该链接时,如果安装了应用程序,请打开该应用程序,并将其引导到正确的activity。
  3. 确认我的动态链接放入浏览器后将重定向到我的网站。
  4. 确认在Android Studio内部测试时,我的动态链接会将用户重定向到正确的activity(并返回深度链接数据)。

以下是我遇到的问题:

  1. 在台式计算机上单击“密码重置”电子邮件中的链接不会重定向我,而是返回网页错误(错误代码400)。
  2. 在手机中单击“密码重置”电子邮件中的链接会将我带到应用程序中的正确屏幕,但不会返回任何数据,只返回NULL。
  3. 如果我单击Nexus 6(模拟器或real phone)上的链接,则重定向有效,但如果我单击Nexus 5X(模拟器)上的链接,则重定向将带我到登录屏幕,但不是正确的activity(未为登录屏幕设置意图过滤器)。所有这些设备都运行相同的API(API 25)。

我一定是漏掉了什么,但我不确定可能是什么。以下是我的设置:

下面的代码是actionCodeSettings和password reset电子邮件代码(编辑的敏感内容):

String url = "https://xxxxx.com";
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.");
                    hideProgressDialog();
                    Toast.makeText(ForgotPasswordActivity.this, getString(R.string.alert_passwordResetConfirm),
                            Toast.LENGTH_SHORT).show();
                }
                else {
                    Exception e = task.getException();
                    Log.w(TAG, "passwordResetRequest:failure " + e.getMessage(), task.getException());
                    hideProgressDialog();
                    Toast.makeText(ForgotPasswordActivity.this, e.getMessage(),
                            Toast.LENGTH_SHORT).show();

                    if (e instanceof FirebaseAuthInvalidCredentialsException) {
                        emailText.setError(getString(R.string.validate_email));
                    }
                }
            }
        });

Android清单xml材料:

<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="xxxxx.app.goo.gl" android:scheme="http"/>
        <data android:host="xxxxx.app.goo.gl" android:scheme="https"/>
    </intent-filter>

当用户返回app时抓取深度链接数据的代码:

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) {
                    deepLink = pendingDynamicLinkData.getLink();
                }


                if (deepLink != null) {
                    Log.d(TAG, "Received Deep Link Data: " + deepLink.toString());
                }
                else {
                    Log.d(TAG, "Received Deep Link Data: " + null);
                }
                // Handle the deep link. For example, open the linked
                // content, or apply promotional credit to the user's
                // account.
                // ...

                // ...
            }
        })
        .addOnFailureListener(this, new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.w(TAG, "getDynamicLink:onFailure", e);
            }
        });

最后,给出了用户将在电子邮件中收到的示例URL:

https://xxxxx.app.goo.gl?link=https://xxxxx-00000.firebaseapp.com/__/auth/action?apiKey%<api key redacted>%26mode%3DresetPassword%26oobCode%3D<reset code redacted>%26continueUrl%3Dhttps://xxxxx.app.goo.gl/pass%26lang%3Den&apn=com.xxxxx.android

如有任何帮助,将不胜感激。

附注。文档中有一些提到,为了在应用程序中获取深度数据,我们调用了launcher(activity)中的FireBasedynamicLinks.getDynamicLink()以及deep link(activity)。我也试过了...数据还是空的。

补充说明:如果我在深链接打开的activity里放了以下内容:

Intent intent = getIntent();
    String action = intent.getAction();
    Uri data = intent.getData();

    Log.d(TAG, "Data Data?: " + data.toString());

我会得到用户点击后将他们带到应用程序的完整路径。

提前感谢您的帮助!

共有1个答案

尹昀
2023-03-14

我没有深入了解您的答案,但我注意到一个危险信号,因为您正在将FDL链接设置为您的深度链接https://xxxxx.app.goo.gl/pass”

// I speculate this is the root cause. You are ending up with a double
// dynamic link. Change this to a webpage you own.
String url = "https://xxxxx.app.goo.gl/pass";
ActionCodeSettings settings = ActionCodeSettings.newBuilder()
    .setAndroidPackageName(
            getPackageName(),
            true, /* install if not available? */
            null   /* minimum app version */)
    .setHandleCodeInApp(true)
    .setUrl(url)
    .build();
 类似资料:
  • 我正在使用firebase来验证我的android应用程序中的用户。我在登录窗口中为用户提供了一个重置密码的选项。当用户点击按钮,它发送电子邮件成功。然而,当用户点击链接时,它总是显示 “请重置密码。重置密码的请求已过期,或链接已被使用” 2016年8月31日更新 我与firebase支持取得了联系,看起来API键有一些bug。如果更改浏览器API密钥,则不会更新。现在这个bug已经修复,重置密码

  • 有没有办法让用户在重置密码时重置其firebase密码,而无需实际验证帐户? 最初创建帐户时,用户信息中的“已验证”设置为false,一旦创建帐户,我们将收到一封带有验证帐户url的电子邮件。但是,当用户“忘记密码”时,密码重置邮件将发送给用户,当用户实际重置密码时,firebase userinfo“验证”设置为true。

  • 调用 使用从动态链接获取查询参数(在本例中获取用于重置密码的密码代码。 在上一步中使用oobCode并调用按钮单击(从Use inputted editText字段中获取密码)来重置密码。 理想情况下,我希望在密码重置后登录我的用户。为了做到这一点,我需要有电子邮件地址使用密码重置(我需要从试图登录的用户获得firestore文档信息)。 所以我需要能够传递电子邮件地址到屏幕重置密码。 以下是我的

  • 我有一个kubernetes集群,安装了保险库(通过头盔图表)。 我想将机密从vault填充到pod中的文件(例如nginx),并每5分钟刷新一次机密。 我使用以下配置对其进行了测试(使用适当的vault策略/后端身份验证): namespace.yaml Service_account.yaml nginx-deployment.yaml 当我将此配置应用于kubernetes集群时,将创建部署

  • 我正在使用Firebase以及作为Firebase动态链接的一部分生成的url。 > firebase动态url如下所示:例如:https://myapp.page.link/h1c4 用户收到电子邮件并点击验证链接。 在重定向结束时,我可以看到url包含如下所示的oobCode: https://myapp.page.link/h1c4?apikey=&oobcode=yg2n2elu4qgbs

  • 在工作中,当通过firebase门户创建动态链接时,我们尝试使用可选的活动跟踪UTM参数。 动态链接工作正常,据我所知,从所有官方文档中可以看出,在创建动态链接时,只需在最后一个可选步骤中添加UTM值,就应该会导致这些值与事件一起发送。 但是,当我们在dynamic_link_app_open事件的事件或转化标签上查看没有看到任何归因值。我们看到该事件正在发送,但我们只是没有获得广告系列归因值,因