添加额外的 HTTP 请求标头

HTTP 请求包含 User-Agent 或 Content-Type 等标头。除了 Android 应用可能会通过 EXTRA_HEADERS intent extra。出于安全考虑,Chrome 过滤掉了一些额外的标头 具体取决于 intent 的启动方式和位置。

跨源请求需要额外的安全层,因为客户端和服务器 并非由同一方所有。本指南讨论了通过 Chrome 启动此类请求 自定义标签页,即从在浏览器标签页中打开网址的应用启动的 intent。直到 Chrome 83 之后,开发者可以在启动自定义标签页时添加任何标头。从版本 83 开始, 开始过滤除 Approvelist 跨源标头以外的所有标头,因为未批准的标头 造成了安全风险从 Chrome 86 开始,可以将未批准的标头附加到 跨源请求(当服务器和客户端使用数字资产链接建立关联时)。 下表汇总了此行为:

Chrome 版本 允许使用 CORS 标头
Chrome 83 之前的版本 已列入批准列表、未列入列表
Chrome 83 至 Chrome 85 已列入已批准
从 Chrome 86 及更高版本 已列入已批准、未列入审批列表(如果设置了 Digital Asset Links)

表 1.:过滤未获批的 CORS 标头。

本文介绍如何在服务器和客户端之间建立经过验证的连接,并使用该连接 用于发送已列入已批准列表和未列入批准的 http 标头。您可以跳至 针对代码向自定义标签页 intent 添加额外的标头

背景

已获批与未获批的 CORS 请求标头

跨域资源共享 (CORS) 功能允许来自一个源的 Web 应用请求 来自不同来源的资源CORS-approvelist 标头列表保存在 HTML 标准。已批准的标头示例如下表所示:

标题 说明
accept-language 宣传客户能理解的自然语言
内容-语言 描述的是面向当前受众群体的语言
content-type 表示资源的媒体类型

表 2.:已列入许可名单的 CORS 标头示例。

已获批的标头被视为安全标头,因为它们不包含敏感的 用户信息,并且不太可能导致服务器执行具有潜在破坏性的操作。

下表列出了未被批准的标头示例:

标题 说明
bearer-token 在服务器上对客户端进行身份验证
指明请求的来源
饼干 包含由服务器设置的 Cookie

表 3.:未批准的 CORS 标头示例。

HTML 标准和服务器不建议将未批准的标头附加到 CORS 请求 假设跨源请求仅包含已列入已批准的标头。发送未获批的标头 来自跨域网域的标头会允许恶意的第三方应用编写标头来滥用用户 Chrome(或其他浏览器)存储和附加至请求的 Cookie。Cookie 对恶意服务器交易进行身份验证。

将 CORS 批准的标头附加到自定义标签页请求

自定义标签页是在自定义的浏览器标签页中启动网页的特殊方式。自定义标签 可以使用 CustomTabsIntent.Builder() 创建 intent。您也可以将标头附加到这些 intent:使用带有 Browser.EXTRA_HEADERS 标志Bundle

CustomTabsIntent intent = new CustomTabsIntent.Builder(session).build();

Bundle headers = new Bundle();
headers.putString("bearer-token", "Some token");
headers.putString("redirect-url", "Some redirect url");   
intent.intent.putExtra(Browser.EXTRA_HEADERS, headers);

intent.launchUrl(Activity.this, Uri.parse("http://www.google.com"));

我们始终可以将已批准的标头附加到自定义标签页 CORS 请求。不过,Chrome 过滤器 未列入批准的标头。虽然其他浏览器可能会有不同的行为 一般情况下,开发者应该会发现未被批准的标头会被阻止。

要在自定义标签中加入未批准的标头,支持的方法是首先验证 使用数字访问链接的跨源连接。下一部分将介绍如何设置 并使用所需标头启动自定义标签页 intent。

向自定义标签页 intent 添加额外的标头

要允许通过自定义标签页 intent 传递未列入批准的标头,必须设置 在 Android 应用与 Web 应用之间建立数字资产关联,用于验证作者是否 拥有这两个应用

请按照官方指南设置数字资产链接。对于关联关系用途 "delegate_permission/common.use_as_origin"`,以表明这两个应用属于同一个应用 “来源”链接。

创建带有额外标头的自定义标签页 intent

您可以通过多种方式创建自定义标签页 intent。您可以使用现有的构建器 方法是将该库添加到 build 依赖项中:

MULTI_LINE_CODE_PLACEHOLDER_1

构建 intent 并添加额外的标头:

MULTI_LINE_CODE_PLACEHOLDER_2

自定义标签页连接用于在应用和CustomTabsSession Chrome 标签页。我们需要会话来验证应用和 Web 应用是否属于同一源。 只有正确设置数字资产链接,验证才会通过。

建议调用 CustomTabsClient.warmup()。它允许浏览器应用 并加快网址打开过程。

MULTI_LINE_CODE_PLACEHOLDER_3

设置在验证后启动 intent 的回调

CustomTabsCallback 已传入会话。我们为其 onRelationshipValidationResult(),用于启动之前创建的 CustomTabsIntent 一旦来源验证成功

MULTI_LINE_CODE_PLACEHOLDER_4

绑定自定义标签页服务连接

绑定 Service 会启动 Service 和连接的 onCustomTabsServiceConnected() 最终将调用 。别忘了适当解除绑定该服务。绑定和解除绑定 通常在 onStart()onStop() activity 生命周期方法中完成。

// Bind the custom tabs service connection.
// Call this in onStart()
CustomTabsClient.bindCustomTabsService(this,
    CustomTabsClient.getPackageName(MainActivity.this, null), connection);

// …
// Unbind the custom tabs service.
// Call this in onStop().
unbindService(connection);

演示应用代码

您可以点击此处,详细了解自定义标签页服务。请参阅 android-browser-helper GitHub 代码库,获取正常运行示例应用。

摘要

本指南介绍了如何向自定义标签页 CORS 请求添加任意标头。 已获准列出的标头可以附加到每个自定义标签页 CORS 请求。未列入批准的标头 在 CORS 请求中通常被视为不安全,因此 Chrome 默认会滤除它们。附加这些文件是 仅允许同源的客户端和服务器使用,且通过数字资产链接进行验证。