Firebase动态链接:使用ActionCodeSettings(继续URL)重置密码无效

时间:2018-07-16 19:16:30

标签: android firebase firebase-authentication firebase-dynamic-links

我已经为此动了好几个星期。我无法重设自定义密码,让用户在应用程序内重设密码。

到目前为止,我可以执行以下操作:

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

以下是我遇到的问题:

  1. 单击桌面上密码重置电子邮件中的链接 计算机不重定向我,而是返回网页错误 (错误代码400)。
  2. 单击手机中的密码重置电子邮件中的链接会带我 到应用程序中正确的屏幕,但不返回任何数据,只是 空。
  3. 如果我点击Nexus 6(仿真器或真实手机)上的链接, 重定向有效,但是如果我点击Nexus 5x(仿真器)上的链接, 重定向将我带到我的登录屏幕,但没有正确的活动 (未为登录屏幕设置意图过滤器)。所有这些 设备运行相同的API(API 25)。

我一定想念一些东西,但是我不确定那是什么。这是我的设置:

Firebase控制台中的我的详细信息链接页面(已编辑的敏感信息): enter image description here

以下代码是actionCodeSettings和密码重置电子邮件代码(已删除敏感内容):

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>

当用户返回到应用时获取深层链接数据的代码:

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

任何帮助将不胜感激。

P.S。在文档中提到要在应用程序中获取深层数据,我们称之为:启动器活动以及深层链接活动中的FirebaseDynamicLinks.getDynamicLink()。我也尝试过...仍然有空数据。

附加说明: 如果我在深层链接打开的活动中添加了以下内容:

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

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

我获得了用户单击以将其带到应用程序的完整路径。

在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

我没有深入探讨您的答案,但是我注意到一个危险信号,因为您将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();

答案 1 :(得分:0)

您必须从您的服务器创建自定义操作链接,或者它可以来自 Firebase 云功能。当您生成操作链接时,您可以添加动态链接的域名,因此 firebase 会根据您的动态链接域向您发送操作链接,然后从代码中的 URL 检索参数会更容易。

https://firebase.google.com/docs/auth/admin/email-action-links