获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

在电子邮件操作中传递状态

在发送用于重置密码或验证用户电子邮件的电子邮件操作时,您可以通过继续 URL 传递状态。这使用户能够在操作完成后返回到应用程序。此外,您可以指定是否在安装时直接从移动应用程序而不是网页处理电子邮件操作链接。

这在以下常见场景中非常有用:

  • 当前未登录的用户可能正在尝试访问需要用户登录的内容。但是,用户可能忘记了密码,因此触发了重置密码流程。在流程结束时,用户希望返回到他们尝试访问的应用程序部分。

  • 应用程序只能提供对经过验证的帐户的访问权限。例如,时事通讯可能要求用户在订阅前验证他们的电子邮件。用户将通过电子邮件验证流程并期望返回到应用程序以完成他们的订阅。

  • 在其他情况下,用户可能已经从他们的移动设备开始流程,并希望在验证后返回到他们的移动应用程序而不是浏览器。

能够通过连续 URL 传递状态是 Firebase Auth 提供的一项强大功能,可以显着增强用户体验。

在电子邮件操作中传递状态/继续 URL

为了安全地传递 continue URL,需要在Firebase 控制台中将 URL 的域列入白名单。这是在身份验证部分通过将此域添加到登录方法选项卡下的授权域列表(如果尚不存在)来完成的。

发送密码重置电子邮件或验证电子邮件时需要提供ActionCodeSettings实例。它可以使用关联的ActionCodeSettings.Builder类创建,该类包含以下方法:

方法描述
setUrl(String url)

设置在不同上下文中具有不同含义的链接(state/continue URL):

  • 当链接在 Web 操作小部件中处理时,这是continueUrl查询参数中的深层链接。
  • 当直接在app中处理链接时,这是动态链接深层链接中的continueUrl查询参数。
setIOSBundleId(String iOSBundleId)设置 iOS 包 ID。如果已安装,这将尝试在 iOS 应用程序中打开链接。 iOS 应用程序需要在控制台中注册。
setAndroidPackageName(String androidPackageName, boolean installIfNotAvailable, String minimumVersion)设置 Android 包名称。如果已安装,这将尝试在 Android 应用程序中打开链接。如果 installIfNotAvailable 设置为true ,它指定是否安装 Android 应用程序(如果设备支持它并且尚未安装该应用程序)。如果指定了 minimumVersion,并且安装了旧版本的应用程序,用户将被带到 Play 商店升级应用程序。 Android 应用程序需要在控制台中注册。
setHandleCodeInApp(boolean status)电子邮件操作链接是先在移动应用程序中打开还是先在 Web 链接中打开。默认为假。设置为 true 时,操作代码链接将作为通用链接或 Android 应用程序链接发送,如果已安装,将由应用程序打开。在错误的情况下,代码将首先发送到网络小部件,然后继续将重定向到应用程序(如果已安装)。
setDynamicLinkDomain(String dynamicLinkDomain)如果要使用 Firebase 动态链接打开当前链接,则设置要用于当前链接的动态链接域(或子域)。由于可以为每个项目配置多个动态链接域,因此该字段提供了明确选择一个的能力。如果未提供,则默认使用第一个域。

以下示例说明了如何发送将首先在移动应用程序中打开的电子邮件验证链接作为 Firebase 动态链接(iOS 应用程序com.example.ios或 Android 应用程序com.example.android )。深层链接将包含继续 URL 负载https://www.example.com/?email=user@example.com

Kotlin+KTX

val auth = Firebase.auth
val user = auth.currentUser!!

val url = "http://www.example.com/verify?uid=" + user.uid
val actionCodeSettings = ActionCodeSettings.newBuilder()
        .setUrl(url)
        .setIOSBundleId("com.example.ios")
        // The default for this is populated with the current android package name.
        .setAndroidPackageName("com.example.android", false, null)
        .build()

user.sendEmailVerification(actionCodeSettings)
        .addOnCompleteListener { task ->
            if (task.isSuccessful) {
                Log.d(TAG, "Email sent.")
            }
        }

Java

FirebaseAuth auth = FirebaseAuth.getInstance();
FirebaseUser user = auth.getCurrentUser();

String url = "http://www.example.com/verify?uid=" + user.getUid();
ActionCodeSettings actionCodeSettings = ActionCodeSettings.newBuilder()
        .setUrl(url)
        .setIOSBundleId("com.example.ios")
        // The default for this is populated with the current android package name.
        .setAndroidPackageName("com.example.android", false, null)
        .build();

user.sendEmailVerification(actionCodeSettings)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "Email sent.");
                }
            }
        });

Firebase Auth 在发送要在移动应用程序中打开的链接时使用Firebase 动态链接。为了使用此功能,需要在 Firebase 控制台中配置动态链接。

  1. 启用 Firebase 动态链接:

    1. Firebase 控制台中,打开动态链接部分。
    2. 如果您尚未接受动态链接条款并创建动态链接域,请立即接受。

      如果您已经创建了动态链接域,请记下它。动态链接域通常类似于以下示例:

      example.page.link

      当您配置 Apple 或 Android 应用程序以拦截传入链接时,您将需要此值。

  2. 配置 Android 应用程序:

    1. 如果您计划从您的 Android 应用程序处理这些链接,则需要在 Firebase 控制台项目设置中指定 Android 包名称。此外,还需要提供申请证书的SHA-1和SHA-256。
    2. 您还需要为 AndroidManifest.xml 文件中的深层链接配置意图过滤器。
    3. 有关更多信息,请参阅接收 Android 动态链接说明
  3. 配置 iOS 应用程序:

    1. 如果您计划从您的 iOS 应用程序处理这些链接,则需要在 Firebase 控制台项目设置中指定 iOS 包 ID。此外,还需要指定 App Store ID 和 Apple Developer Team ID。
    2. 您还需要将 FDL 通用链接域配置为应用程序功能中的关联域。
    3. 如果您计划将您的应用程序分发到 iOS 8 及以下版本,您将需要将您的 iOS 包 ID 设置为传入 URL 的自定义方案。
    4. 有关更多信息,请参阅接收 iOS 动态链接说明

在 Web 应用程序中处理电子邮件操作

您可以指定是否要先处理来自 Web 应用程序的操作代码链接,然后在成功完成后重定向到另一个网页或移动应用程序,前提是移动应用程序可用。这是通过在ActionCodeSettings.Builder对象中调用setHandleCodeInApp(false)来完成的。虽然不需要 iOS 包 ID 或 Android 包名称,但提供它们将允许用户在电子邮件操作代码完成时重定向回指定的应用程序。

此处使用的网址是在电子邮件操作模板部分中配置的网址。为所有项目提供了一个默认值。请参阅自定义电子邮件处理程序以了解有关如何自定义电子邮件操作处理程序的更多信息。

在这种情况下, continueUrl查询参数中的链接将是一个 FDL 链接,其负载是ActionCodeSettings对象中指定的URL 。虽然您可以在没有任何额外依赖的情况下拦截和处理来自应用的传入链接,但我们建议您使用 FDL 客户端库来为您解析深层链接。

在处理邮件验证等邮件动作时,需要从深层链接解析oobCode查询参数中的动作代码,然后通过applyActionCode应用,使更改生效,即验证邮件。

在移动应用程序中处理电子邮件操作

如果已安装,您可以指定是否要先在移动应用程序中处理操作代码链接。对于 Android 应用程序,您还可以通过installIfNotAvailable布尔值指定要安装的应用程序(如果设备支持该应用程序并且尚未安装)。如果从不支持移动应用程序的设备单击链接,则会从网页打开它。这是通过在ActionCodeSettings.Builder对象中调用setHandleCodeInApp(true)来完成的。还需要指定移动应用程序的 Android 包名称或 iOS 包 ID。

当没有可用的移动应用程序时,此处使用的后备 web URL 是在电子邮件操作模板部分中配置的。为所有项目提供了一个默认值。请参阅自定义电子邮件处理程序以了解有关如何自定义电子邮件操作处理程序的更多信息。

在这种情况下,发送给用户的移动应用程序链接将是一个 FDL 链接,其有效负载是操作代码 URL,在控制台中配置,具有查询参数oobCodemodeapiKeycontinueUrl 。后者将是ActionCodeSettings对象中指定的原始URL 。虽然您可以在没有任何额外依赖的情况下拦截和处理来自应用的传入链接,但我们建议您使用 FDL 客户端库来为您解析深层链接。可以直接从移动应用程序应用操作代码,类似于从自定义电子邮件处理程序部分中描述的 Web 流处理它的方式。

在处理邮件验证等邮件动作时,需要从深层链接解析oobCode查询参数中的动作代码,然后通过applyActionCode应用,使更改生效,即验证邮件。