使用“Auth”标签页简化身份验证

Auth Tab 提供安全且简化的身份验证流程,可在 Android 应用中使用。通过创建和启动 AuthTabIntent,您可以调用专门用于管理端到端身份验证体验的自定义标签页。该标签页经过精简,功能有限,可让用户专注于手头的任务。完成后,该标签页会使用 HTTPS 或自定义架构回调您的应用并返回结果。

功能齐全的自定义标签页
图 1. 功能齐全的自定义标签页。
包含最基本功能的授权标签页
图 2. 具有最低限度功能的身份验证标签页。

从 Chrome 132 开始,身份验证标签页可以直接替换现有的自定义标签页身份验证集成。对于设备不支持身份验证标签页的用户,系统会自动回退到自定义标签页。只需修改几行代码,即可从自定义标签页迁移到身份验证标签页。

运作方式

借助身份验证标签页,客户端应用会启动一个专门的自定义标签页,该标签页会显示一个浏览器窗口,其中加载了包含预期身份验证页面的网址。完成后,身份验证标签页会使用回调返回身份验证结果。

身份验证完成后,当导航到之前提供的回调重定向 URI 时,系统会捕获重定向,并通过回调将其返回给客户端应用。对于使用 https 架构的重定向,浏览器会使用数字资产链接验证重定向网域和客户端应用是否归同一发布商所有。

客户端使用提供的回调接收具有重定向方案(或对于 https,重定向主机和路径)的已导航 URI。此数据包括结果代码以及身份验证接口提供的任何其他数据。您可以使用此数据来验证身份验证或处理不成功的场景。

为什么需要“授权”标签页?

在推出 Auth Tab 之前,您可以使用标准的 Custom Tabs intent 来支持身份验证流程。身份验证标签页是首选,因为它可提供增强的安全性、简化的体验,还可从客户端代码中抽象出一些用于身份验证的内部组件。因此,您会发现“身份验证”标签页可提供更好的体验。

增强型安全功能

在典型的自定义标签页实现中,需要一个 intent 来接收处理身份验证的浏览器窗口中的数据。这需要额外的代码,并会使您的应用面临潜在的意图干扰。借助授权标签页,系统会使用回调接收数据,并在 Android API 和客户端应用之间直接传输数据。

精简的体验

在自定义标签页中,用户可以访问浏览器中的其他功能,这些功能可能不适合身份验证流程。身份验证标签页提供精简的体验,其中移除了标准自定义标签页中的大多数自定义选项。对于 Chrome 浏览器,这包括最小化按钮、长按上下文菜单和触控搜索,以及用于在 Chrome 中打开、添加书签、下载和分享以及添加到主屏幕的菜单项。

身份验证标签页仍然保留了以下功能:让浏览器自动填充之前保存的密码和付款信息、向后或向前导航、刷新、显示网页信息、请求网页的桌面版以及提供翻译。

数据抽象

仅实现授权标签页即可消除对以下各项的需求:用于从浏览器接收数据的 intent,以及之前为使身份验证正常运行而需要在 AndroidManifest.xml 中使用的 intent 过滤器。这样可消除客户端的复杂性。其中一些功能仍可包含在客户端代码中,以便在用户设备上没有身份验证标签页的情况下,提供与自定义标签页的向后兼容性。

实现身份验证标签页

“身份验证”标签页需要 AndroidX 浏览器身份验证库。可以在项目的 build.gradle 文件的依赖项部分中添加 AndroidX Browser 库。这些 API 在 Alpha 版 build 中提供。将以下内容添加到 build 文件中:

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

在启动授权标签页之前,声明一个 ActivityResultLauncher,该 ActivityResultLauncher 接受 ActivityResultCallerActivityResultCallback。此操作在创建 activity 或 fragment 之前完成:

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

从自定义标签页迁移到身份验证标签页

通过将自定义标签页 intent 修改为新的 Auth Tab intent,更新现有的自定义标签页身份验证实现。添加代码后,找到 Custom Tabs intent 并将其修改为新的 Auth Tab intent。

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

回退到自定义标签页

某些实现可能需要身份验证,但用户的设备未配备处理“身份验证”标签页的功能。例如,如果默认浏览器不支持身份验证标签页,或者默认浏览器的版本未达到所需级别,则可能会发生这种情况。在这种情况下,对于支持自定义标签页的浏览器,身份验证标签页 intent 会自动启动自定义标签页。

您可以使用 CustomTabsClient#isAuthTabSupported() 检查浏览器是否支持 Auth Tab。此方法可让您的应用根据浏览器功能动态选择启动授权标签页还是自定义标签页流程。为了妥善处理不支持授权标签页的情况,请添加授权标签页实现,同时保留现有的自定义标签页代码来处理授权流程,以作为后备方案。

请注意处理可能进入 ActivityResultCallback 或 Activity intent 的数据。请注意,如果使用 AuthTabIntent 启动回退体验,但当前浏览器不支持授权标签页,则当自定义标签页关闭时,您的应用会收到 Activity.RESULT_CANCELED 结果。

如需查看将身份验证标签页实现为回退到自定义标签页的示例,请参阅 Android 浏览器辅助程序库。

其他资源