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

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

功能齐全的自定义标签页
图 1. 自定义标签页提供完整功能。
包含最基本功能的 Auth 标签页
图 2. 功能最少的“Authentication”标签页。

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

运作方式

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

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

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

为什么要使用“Authentication”标签页?

在身份验证标签页之前,您可以使用标准自定义 Tabs intent 来实现身份验证流程。建议使用身份验证标签页,因为它可增强安全性、简化体验,还可从客户端代码中提取一些用于身份验证的内部信息。因此,您会发现 Auth Tab 可提供更好的体验。

增强型安全功能

在典型的自定义标签页实现中,需要 intent 才能从处理身份验证的浏览器窗口接收数据。这需要额外的代码,并且会使您的应用容易受到 intent 干扰。使用 Auth Tab 时,系统会使用回调接收数据,并在 Android API 和客户端应用之间直接传输数据。

简化体验

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

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

数据抽象

仅实现 Auth Tab 即可避免使用 intent 从浏览器接收数据,以及之前为了使身份验证正常运行而需要在 AndroidManifest.xml 中使用的 intent 过滤器。这样可以简化客户端的复杂性。在用户设备上无法使用 Auth Tab 的情况下,您仍然可以在客户端代码中添加其中的一些功能,以便与 Custom Tabs 向后兼容。

实现 Auth 标签页

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

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

在启动 Auth 标签页之前,声明一个接受 ActivityResultCallerActivityResultCallbackActivityResultLauncher。此操作是在创建 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:对于自定义重定向 scheme,浏览器会重定向并返回提供 scheme 的 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);

回退到自定义标签页

如果用户的设备无法处理 Auth Tab,某些实现可能需要进行身份验证。例如,如果默认浏览器不支持 Auth Tab,或者默认浏览器的版本不符合要求,就可能会发生这种情况。在这些情况下,对于支持自定义标签页的浏览器,Auth Tab intent 会自动启动自定义标签页。

如需妥善处理这种情况,请添加 Auth Tab 实现,同时保留现有的自定义标签页代码来处理身份验证流程作为后备。

使用支持身份验证标签页的设备的用户会看到新的身份验证标签页流程,而其他用户则会回退到旧版自定义标签页实现。请谨慎处理可能会传入 ActivityResultCallback 或 activity intent 的数据。请注意,如果使用 AuthTabIntent 启动后备体验,并且当前浏览器不支持 Auth Tab,则在自定义标签页关闭时,您的应用会收到 Activity.RESULT_CANCELED 结果。

如需查看 Auth Tab 实现示例(会回退到 Custom Tabs),请参阅 Android 浏览器辅助程序库。

其他资源