電子郵件動作中的狀態

傳送密碼重設電子郵件動作或驗證使用者的電子郵件時,您可以透過繼續網址傳遞狀態。這樣一來,使用者就能在完成動作後返回應用程式。此外,您可以指定是否要直接從已安裝的行動應用程式 (而非網頁) 處理電子郵件動作連結。

這在下列常見情境中非常實用:

  • 使用者可能會嘗試存取需要登入才能存取的內容,但目前並未登入。不過,使用者可能忘記密碼,因此會觸發重設密碼流程。在流程結束時,使用者會預期返回原本嘗試存取的應用程式部分。

  • 應用程式只能提供已驗證的帳戶存取權。舉例來說,電子報可能會要求使用者在訂閱前驗證電子郵件地址。使用者會完成電子郵件驗證流程,並預期返回應用程式完成訂閱。

  • 在其他情況下,使用者可能會透過行動裝置啟動流程,並希望驗證完成後會返回行動應用程式,而非瀏覽器。

透過繼續網址傳遞狀態是 Firebase Auth 提供的強大功能,可大幅改善使用者體驗。

在電子郵件動作中傳遞狀態/繼續網址

為確保安全地傳送繼續網址,您需要在 Firebase 控制台中將網址的網域加入許可清單。如要完成這項操作,請前往「Authentication」部分,將這個網域新增至「Sign-in method」分頁下方的「Authorized domains」清單中 (如果尚未加入)。

傳送密碼重設電子郵件或驗證電子郵件時,必須提供 ActionCodeSettings 例項。您可以使用相關聯的 ActionCodeSettings.Builder 類別建立此類別,該類別包含下列方法:

方法 說明
setUrl(String url)

設定在不同情境中具有不同意義的連結 (狀態/繼續網址):

  • 如果連結是在網頁動作小工具中處理,則這是 continueUrl 查詢參數中的深層連結。
  • 如果連結是直接在應用程式中處理,則這是動態連結深層連結中的 continueUrl 查詢參數。
setIOSBundleId(String iOSBundleId) 設定 iOS 軟體包 ID。系統會嘗試在已安裝的 iOS 應用程式中開啟連結。iOS 應用程式必須在控制台註冊。
setAndroidPackageName(String androidPackageName, boolean installIfNotAvailable, String minimumVersion) 設定 Android 套件名稱。系統會嘗試在已安裝的 Android 應用程式中開啟連結。如果將 installIfNotAvailable 設為 true,則會在裝置支援 Android 應用程式且尚未安裝時,指定是否要安裝 Android 應用程式。如果指定 minimumVersion,且安裝的是舊版應用程式,使用者會被帶往 Play 商店升級應用程式。Android 應用程式必須在管理中心註冊。
setHandleCodeInApp(boolean status) 電子郵件動作連結是否會先在行動應用程式或網頁連結中開啟。預設值為 false。如果設為 True,系統會以通用連結或 Android 應用程式連結傳送動作碼連結,並在應用程式安裝後由應用程式開啟。在 false 的情況下,系統會先將程式碼傳送至網頁小工具,然後在繼續時重新導向至已安裝的應用程式。
setDynamicLinkDomain(String dynamicLinkDomain) 如果要使用 Firebase 動態連結開啟目前連結,則可設定要使用的動態連結網域 (或子網域)。每個專案可設定多個動態連結網域,因此這個欄位可讓您明確選擇其中一個網域。如果未提供任何網域,系統會預設使用第一個網域。

以下範例說明如何傳送電子郵件驗證連結,該連結會先在行動應用程式中以 Firebase 動態連結 (iOS 應用程式 com.example.ios 或 Android 應用程式 com.example.android) 的形式開啟。深層連結會包含繼續網址酬載 https://www.example.com/?email=user@example.com

Kotlin

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 Dynamic Links。如要使用這項功能,您必須在 Firebase 控制台中設定動態連結。

  1. 啟用 Firebase Dynamic Links:

    1. Firebase 控制台中,開啟「Dynamic Links專區。
    2. 如果您尚未接受 Dynamic Links 條款並建立 Dynamic Links 網域,請立即完成。

      如果您已建立 Dynamic Links 網域,請記下該網域。Dynamic Links 網域通常如下所示:

      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 開發人員團隊 ID。
    2. 您也必須將 FDL 通用連結網域設為應用程式功能中的關聯網域。
    3. 如果您打算將應用程式發布至 iOS 8 以下版本,就必須將 iOS 軟體包 ID 設為傳入網址的自訂配置。
    4. 詳情請參閱「接收 iOS 動態連結指示」。

在網路應用程式中處理電子郵件動作

您可以指定是否要先從網頁應用程式處理動作碼連結,然後在完成後重新導向至其他網頁或行動應用程式 (如果有)。方法是在 ActionCodeSettings.Builder 物件中呼叫 setHandleCodeInApp(false)。雖然 iOS 軟體包 ID 或 Android 套件名稱並非必要,但提供這些資訊可讓使用者在完成電子郵件動作代碼後,重新導向至指定的應用程式。

這裡使用的網址是電子郵件動作範本部分中設定的網址。系統會為所有專案配置預設的專案。如要進一步瞭解如何自訂電子郵件動作處理常式,請參閱「自訂電子郵件處理常式」。

在這種情況下,continueUrl 查詢參數中的連結會是 FDL 連結,其酬載為 ActionCodeSettings 物件中指定的 URL。雖然您可以攔截並處理來自應用程式的傳入連結,而無需任何額外依附元件,但我們建議您使用 FDL 用戶端程式庫,為您剖析深層連結。

處理電子郵件驗證等電子郵件動作時,需要從深層連結解析 oobCode 查詢參數的動作代碼,然後透過 applyActionCode 套用變更,才能生效,也就是驗證電子郵件。

在行動應用程式中處理電子郵件動作

您可以指定是否要在行動應用程式中先處理動作碼連結 (如果已安裝)。對於 Android 應用程式,您也可以透過 installIfNotAvailable 布林值指定,如果裝置支援應用程式且尚未安裝,則安裝該應用程式。如果使用者從不支援行動應用程式的裝置點選連結,系統會改為從網頁開啟連結。方法是在 ActionCodeSettings.Builder 物件中呼叫 setHandleCodeInApp(true)。您也必須指定行動應用程式的 Android 套件名稱或 iOS 軟體包 ID。

在沒有行動應用程式可用時,這裡使用的備用網頁網址,就是在電子郵件動作範本部分中設定的網址。系統會為所有專案配置預設的專案。如要進一步瞭解如何自訂電子郵件動作處理常式,請參閱「自訂電子郵件處理常式」。

在這種情況下,傳送給使用者的行動應用程式連結會是 FDL 連結,其酬載為在主控台中設定的動作碼網址,以及查詢參數 oobCodemodeapiKeycontinueUrl。後者是 ActionCodeSettings 物件中指定的原始 URL。雖然您可以攔截並處理來自應用程式的傳入連結,而無需任何額外依附元件,但我們建議您使用 FDL 用戶端程式庫,讓系統為您剖析深層連結。行動應用程式可以直接套用動作程式碼,類似於自訂電子郵件處理程序一節所述,從網路流程處理動作程式碼。

處理電子郵件驗證等電子郵件動作時,需要從深層連結解析 oobCode 查詢參數的動作代碼,然後透過 applyActionCode 套用變更,才能生效,也就是驗證電子郵件。