Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

在電子郵件操作中傳遞狀態

在發送用於密碼重置或驗證用戶電子郵件的電子郵件操作時,您可以通過繼續 URL 傳遞狀態。這使用戶能夠在操作完成後返回應用程序。此外,您可以指定是否在安裝時直接從移動應用程序而不是網頁處理電子郵件操作鏈接。

這在以下常見場景中非常有用:

  • 當前未登錄的用戶可能正在嘗試訪問需要用戶登錄的內容。但是,用戶可能忘記了他們的密碼,因此觸發了重置密碼流程。在流程結束時,用戶希望返回到他們試圖訪問的應用程序部分。

  • 應用程序只能提供對經過驗證的帳戶的訪問。例如,時事通訊可能要求用戶在訂閱前驗證他們的電子郵件。用戶將通過電子郵件驗證流程並期望返回應用程序以完成他們的訂閱。

  • 在其他情況下,用戶可能已經從他們的移動設備啟動了流程,並期望在驗證後返回到他們的移動應用程序而不是瀏覽器。

能夠通過繼續 URL 傳遞狀態是 Firebase 身份驗證提供的一項強大功能,可以顯著增強用戶體驗。

在電子郵件操作中傳遞狀態/繼續 URL

為了安全地傳遞繼續 URL,該 URL 的域需要在Firebase 控制台中列入白名單。這是在身份驗證部分中完成的,方法是將此域添加到登錄方法選項卡下的授權域列表(如果尚未存在)。

發送密碼重置郵件或驗證郵件時需要提供ActionCodeSettings實例。可以使用關聯的ActionCodeSettings.Builder類創建它,該類包含以下方法:

方法描述
setUrl(String url)

設置在不同上下文中具有不同含義的鏈接(狀態/繼續 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)電子郵件操作鏈接將首先在移動應用程序中打開還是在網絡鏈接中打開。默認值為假。設置為 true 時,操作代碼鏈接將作為通用鏈接或 Android 應用程序鏈接發送,如果安裝,應用程序將打開。在錯誤的情況下,代碼將首先發送到 Web 小部件,然後繼續將重定向到應用程序(如果已安裝)。
setDynamicLinkDomain(String dynamicLinkDomain)如果要使用 Firebase 動態鏈接打開當前鏈接,則設置要用於當前鏈接的動態鏈接域(或子域)。由於每個項目可以配置多個動態鏈接域,因此該字段提供了明確選擇一個的能力。如果未提供,則默認使用第一個域。

以下示例說明瞭如何發送電子郵件驗證鏈接,該鏈接將首先作為 Firebase 動態鏈接(iOS 應用com.example.ios或 Android 應用com.example.android )在移動應用中打開。深層鏈接將包含繼續 URL 負載https://www.example.com/?email=user@example.com

爪哇

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.");
                }
            }
        });

科特林+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.")
            }
        }

Firebase 身份驗證在發送要在移動應用程序中打開的鏈接時使用Firebase 動態鏈接。要使用此功能,需要在 Firebase 控制台中配置動態鏈接。

  1. 啟用 Firebase 動態鏈接:

    1. Firebase 控制台中,打開動態鏈接部分。
    2. 如果您尚未接受動態鏈接條款並創建了動態鏈接域,請立即執行。

      如果您已經創建了動態鏈接域,請記下它。動態鏈接域通常類似於以下示例:

      example.page.link

      當您配置 iOS 或 Android 應用程序以攔截傳入鏈接時,您將需要此值。

  2. 配置安卓應用程序:

    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 包名稱,但提供它們將允許用戶在電子郵件操作代碼完成時重定向回指定的應用程序。

此處使用的 Web URL 是在電子郵件操作模板部分中配置的 URL。為所有項目提供了一個默認值。請參閱自定義電子郵件處理程序以了解有關如何自定義電子郵件操作處理程序的更多信息。

在這種情況下, continueUrl查詢參數中的鏈接將是一個 FDL 鏈接,其負載是ActionCodeSettings像中指定的URL 。雖然您可以在沒有任何額外依賴的情況下攔截和處理來自您的應用程序的傳入鏈接,但我們建議使用 FDL 客戶端庫為您解析深層鏈接。

處理email動作時,例如email驗證,需要從深層鏈接解析oobCode查詢參數中的action code,然後通過applyActionCode應用,更改生效,即email要驗證。

在移動應用程序中處理電子郵件操作

如果已安裝,您可以指定是否要首先處理移動應用程序中的操作代碼鏈接。對於 Android 應用程序,您還可以通過installIfNotAvailable布爾值指定如果設備支持該應用程序並且尚未安裝該應用程序,則該應用程序將被安裝。如果從不支持移動應用程序的設備單擊鏈接,則會從網頁打開它。這是通過在ActionCodeSettings.Builder 對像中調用setHandleCodeInApp(true)來完成的。還需要指定移動應用程序的 Android 包名稱或 iOS 包 ID。

當沒有可用的移動應用程序時,此處使用的後備 Web URL 是在電子郵件操作模板部分中配置的 URL。為所有項目提供了一個默認值。請參閱自定義電子郵件處理程序以了解有關如何自定義電子郵件操作處理程序的更多信息。

在這種情況下,發送給用戶的移動應用鏈接將是一個 FDL 鏈接,其負載是操作代碼 URL,在控制台中配置,查詢參數為oobCodemodeapiKeycontinueUrl 。後者將是ActionCodeSettings像中指定的原始URL 。雖然您可以在沒有任何額外依賴的情況下攔截和處理來自您的應用程序的傳入鏈接,但我們建議使用 FDL 客戶端庫為您解析深層鏈接。操作代碼可以直接從移動應用程序應用,類似於在自定義電子郵件處理程序部分中描述的 Web 流中處理它的方式。

處理email動作時,例如email驗證,需要從深層鏈接解析oobCode查詢參數中的action code,然後通過applyActionCode應用,更改生效,即email要驗證。