使用 Auth 分頁簡化驗證程序

Auth 分頁提供安全且簡化的驗證流程,可用於 Android 應用程式。您可以建立及啟動 AuthTabIntent,叫用專用的自訂分頁,用於管理端對端驗證體驗。這個分頁功能簡單,且功能有限,可讓使用者專注於手邊工作。完成後,分頁會使用 https 或自訂結構定義,回撥至應用程式並傳回結果。

功能完整的自訂分頁
圖 1. 自訂分頁完整功能。
包含基本功能的驗證分頁
圖 2. 「Auth」分頁:提供最少功能。

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

運作方式

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

驗證完成後,如果發生前述提供的回呼重新導向 URI 導覽,系統會擷取重新導向,並使用回呼傳回至用戶端應用程式。如果是使用 https 架構的重新導向,瀏覽器會使用 Digital Asset Links 驗證重新導向網域和用戶端應用程式是否由同一家發布商擁有。

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

為何要使用 Auth 分頁?

在 Auth Tab 推出之前,您可以使用標準的 Custom Tabs 意圖來啟用驗證流程。建議使用 Auth 分頁,因為它可提供更高的安全性、簡化使用體驗,並從用戶端程式碼中抽象化部分用於驗證的內部元件。因此,您會發現 Auth 分頁可提供更優質的體驗。

安全再升級

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

精簡流暢的使用體驗

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

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

資料抽象

只要實作 Auth 分頁,就不需要意圖來接收來自瀏覽器的資料,也不需要 AndroidManifest.xml 中的意圖篩選器,這項功能先前是為了讓驗證功能正常運作而需要的。這可簡化用戶端的複雜度。在使用者裝置上無法使用驗證分頁時,您仍可在用戶端程式碼中加入部分這類功能,以便與自訂分頁提供回溯相容性。

實作「Auth」分頁

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

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

在啟動驗證分頁前,請宣告 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 Link 驗證。

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

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

將自訂 Tabs 意圖修改為新的 Auth Tabs 意圖,更新現有的自訂 Tabs 驗證實作。新增程式碼後,請找出「Custom Tabs」意圖,並將其修改為新的「Auth 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 分頁的情況下,部分實作方式可能需要驗證。舉例來說,如果預設瀏覽器不支援 Auth 分頁,或是預設瀏覽器的版本不符合要求,就可能發生這種情況。在這種情況下,如果瀏覽器支援自訂分頁,Auth 分頁意圖會自動啟動自訂分頁。

如要妥善處理這種情況,請新增 Auth Tab 實作項目,同時保留現有的 Custom Tabs 程式碼,以便處理驗證流程。

使用支援驗證分頁的裝置的使用者會看到新的驗證分頁流程,其他使用者則會改用舊版自訂分頁實作。請小心處理可傳送至 ActivityResultCallback 或 Activity 意圖的資料。請注意,如果 AuthTabIntent 用於啟動備用體驗,且目前的瀏覽器不支援 Auth 分頁,則在關閉自訂分頁時,應用程式會收到 Activity.RESULT_CANCELED 結果。

如要查看 Auth Tab 實作範例,並瞭解如何改用自訂分頁,請參閱 Android Browser Helper 程式庫。

其他資源