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-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 添加额外的标头
设置 Digital Asset Links
要允许通过自定义标签页 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 默认会滤除它们。附加这些文件是 仅允许同源的客户端和服务器使用,且通过数字资产链接进行验证。