使用 Auth 分頁簡化驗證程序

Auth Tab 提供安全且簡化的驗證流程,可在 Android 應用程式中使用。建立及啟動 AuthTabIntent 後,即可叫用專門的自訂分頁,管理端對端驗證體驗。這個分頁的功能有限,但可讓使用者專注於當前工作。完成後,分頁會使用 https 或自訂結構定義,將結果回呼至您的應用程式。

功能齊全的自訂分頁
圖 1. 自訂分頁功能齊全。
包含基本功能的驗證分頁
圖 2. 功能最少的「Auth」分頁。

從 Chrome 137 開始,Auth Tab 可直接取代現有的 Custom Tabs 驗證整合。如果使用者的裝置不支援「驗證」分頁,系統會自動改用「自訂分頁」。如要從自訂分頁遷移至驗證分頁,只要修改幾行程式碼即可。

運作方式

使用「驗證」分頁時,用戶端應用程式會啟動專用的自訂分頁,顯示載入網址的瀏覽器視窗,其中包含預期的驗證頁面。完成後,Auth Tab 會使用回呼傳回驗證結果。

驗證完成後,如果系統導覽至先前提供的回呼重新導向 URI,系統會擷取重新導向,並透過回呼傳回給用戶端應用程式。如果是使用 https 結構定義的重新導向,瀏覽器會使用 Digital Asset Links 驗證重新導向網域和用戶端應用程式是否屬於同一位發布者。

用戶端會使用提供的回呼,接收含有重新導向配置 (或 https 的重新導向主機和路徑) 的導覽 URI。這項資料包括結果代碼,以及驗證介面提供的任何其他資料。您可以使用這項資料驗證驗證作業,或處理非成功情境。

為什麼需要「授權」分頁?

在「驗證」分頁推出前,您可以使用標準的 Custom Tabs intent 來支援驗證流程。建議使用「驗證」分頁,因為這樣不僅能提升安全性、簡化流程,還能從用戶端程式碼中抽象化部分內部驗證程序。因此,您會發現「驗證」分頁提供更優質的體驗。

安全再升級

在一般的自訂分頁實作中,需要意圖才能接收處理驗證的瀏覽器視窗資料。這需要額外程式碼,且可能會干擾應用程式的意圖。使用驗證分頁時,系統會透過回呼接收資料,並在 Android API 和用戶端應用程式之間直接傳輸資料。

精簡流暢的使用體驗

在自訂分頁中,使用者可以存取瀏覽器的其他功能,這可能不適合驗證流程。驗證分頁提供精簡的使用體驗,移除標準自訂分頁中的大多數自訂選項。如果是 Chrome 瀏覽器,則包括縮小按鈕、長按內容選單、輕觸搜尋,以及「在 Chrome 中開啟」、「加入書籤」、「下載」、「分享」和「新增至主畫面」等選單項目。

驗證分頁仍保留瀏覽器自動填入先前儲存的密碼和付款資訊、向後或向前瀏覽、重新整理、顯示頁面資訊、要求頁面的電腦版,以及提供翻譯的功能。

資料抽象化

只要導入「驗證」分頁,就不需要意圖從瀏覽器接收資料,也不需要先前在 AndroidManifest.xml 中為驗證功能正常運作而加入的意圖篩選器。這可簡化用戶端作業。如果使用者裝置無法使用 Auth Tab,用戶端程式碼仍可納入部分功能,以提供與自訂分頁的向後相容性。

實作驗證分頁

驗證分頁需要 AndroidX 瀏覽器驗證程式庫。您可以在專案 build.gradle 檔案的依附元件部分新增 AndroidX 瀏覽器程式庫。這些 API 適用於 Alpha 版。在建構檔案中新增下列內容:

dependencies {
    implementation 'androidx.browser:browser:1.9.0'
}

啟動「驗證」分頁前,請先宣告 ActivityResultLauncher,其中會採用 ActivityResultCallerActivityResultCallback。這項作業會在建立活動或片段前完成:

// In your activity

private final ActivityResultLauncher<Intent> mLauncher =
    AuthTabIntent.registerActivityResultLauncher(this, this::handleAuthResult);

private void handleAuthResult(AuthResult result) {
    String message = switch (result.resultCode) {
        case AuthTabIntent.RESULT_OK -> "Received auth result.";
        case AuthTabIntent.RESULT_CANCELED -> "AuthTab canceled.";
        case AuthTabIntent.RESULT_VERIFICATION_FAILED -> "Verification failed.";
        case AuthTabIntent.RESULT_VERIFICATION_TIMED_OUT -> "Verification timed out.";
    }

    if (result.resultCode == AuthTabIntent.RESULT_OK) {
        message += " Uri: " + result.resultUri;
    }

    Toast.makeText(this, message, Toast.LENGTH_LONG).show();  
}

接著,使用 AuthTabIntent.Builder 建構 AuthTabIntent,然後呼叫 launch 方法。啟動方法會根據您需要的配置,接受下列其中一組參數:

  • redirectScheme:如果是自訂重新導向配置,瀏覽器會重新導向並傳回具有所提供配置的 URI。

  • redirectHost、redirectPath:如果是 https 重新導向配置,API 需要個別的主機和路徑,瀏覽器才能偵測到重新導向並傳回 URI。使用 https 時,必須通過 Digital Asset Links 驗證。

private void launchAuthTab() {
    AuthTabIntent authTabIntent = new AuthTabIntent.Builder.build();
    authTabIntent.launch(mLauncher, Uri.parse("https://www.example.com/auth"), "mycustomscheme");
}

private void launchAuthTabHttps() {
    String host = "your_host";
    String path = "your_path";
    AuthTabIntent authTabIntent = new AuthTabIntent.Builder.build();
    authTabIntent.launch(mLauncher, Uri.parse("https://www.example.com/auth", host, path);
}

從自訂分頁遷移至驗證分頁

修改 Custom Tabs intent,將其更新為新的 Auth Tab intent,即可更新現有的 Custom Tabs 驗證實作。加入程式碼後,找出「自訂分頁」意圖,並修改為新的「驗證分頁」意圖。

CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder().build();
customTabsIntent.launchUrl(context, uri)

// change to -->

AuthTabIntent authTabIntent = new AuthTabIntent.Builder.build();

authTabIntent.launch(mLauncher, Uri.parse("https://www.example.com/auth", "mycustomscheme");

/* - OR - */

authTabIntent.launch(mLauncher, Uri.parse("https://www.example.com/auth", host, path);

改用自訂分頁

部分實作方式可能需要驗證,但使用者裝置未配備處理驗證分頁的工具。舉例來說,如果預設瀏覽器不支援驗證分頁,或預設瀏覽器版本未達到必要等級,就可能發生這種情況。在這些情況下,如果瀏覽器支援自訂分頁,系統會自動啟動自訂分頁,而非 Auth Tab 意圖。

您可以使用 CustomTabsClient#isAuthTabSupported() 檢查瀏覽器是否支援 Auth Tab。應用程式可根據瀏覽器功能,動態選擇啟動「驗證分頁」或「自訂分頁」流程。如要妥善處理不支援 Auth Tab 的情況,請新增 Auth Tab 實作,同時保留現有的自訂分頁程式碼,以處理驗證流程做為備援。

請注意處理可能傳送至 ActivityResultCallback 或活動意圖的資料。請注意,如果使用 AuthTabIntent 啟動備用體驗,但目前的瀏覽器不支援 Auth Tab,應用程式會在關閉自訂分頁時收到 Activity.RESULT_CANCELED 結果。

如要查看 Auth Tab 實作範例 (可回退至 Custom Tabs),請參閱 Android Browser Helper 程式庫。

其他資源