有什么方法可以为ES6模块“import”请求指定额外的[HTTP]标头?
我正在实现一个用例,出于安全原因,为我的应用程序资产提供服务的 Web 服务器只会将一个特定 [ES6] 模块的内容仅发送给授权用户/客户端,并通过Authorization请求提供的标头发送。换句话说,对于模块主体的任何 HTTP 请求,作为源自某个import "./module-with-sensitive-data.js"语句(或import调用)的,只有当且仅当服务器通过提供的Authorization标头成功授权请求时,才必须有效地成功。
我没有使用“基本”HTTP 授权方案。授权“承载”令牌由 Web 服务颁发,后者是负责资源访问授权的一方。
显然,为了简洁起见,什么可能是显而易见的,什么构成了我的直接问题,似乎不存在直接指定超出用户代理隐式提供的任何其他标头的工具,请求源自import上述语句/调用.
这个问题的一般形式,为后代,可以说为约两个重叠的,假设的特征:首先,以指定附加的报头的能力import的请求,以及潜在的其他类型的请求,其中当前没有这样的规定变得容易(link和script元件,以举几个例子)。其次,用户代理对“基本”以外的授权方案的额外支持——与后者一样,至少定义了一个“授权领域”,并且用户代理将在其中至少提供一些Authorization头文件,应用程序可能是给予某种控制,一种或另一种方式。无论如何,这是概括,就像我说的,对于后代和上下文。
列出一些解决我当前问题的解决方案,到目前为止我一直在考虑的解决方案,它们都有不小的缺点:
-
使用 Service Worker 拦截 HTTP 请求并
Authorization在适当时添加标头。这应该可以实现预期的结果,但是引入了我现在必须管理的整个 Service Worker,以及 API 使用它所需的一切(激活?消息传递?)再次提高用户代理功能支持的标准,以添加标头对于模块导入请求(当然,可能所有支持模块的用户代理都支持服务工作者)。 -
使用 获取实际模块资源
fetch,这将允许我Authorization为请求提供标头等,然后通过URL.createObjectURL调用为响应 blob 创建一个 URL ,并将该 URL 提供给import过程(或者甚至import声明,如果它支持类型模块规范 URL)。我怀疑这种方法的一个缺点是模块将无法使用相对路径导入其他模块,它可能想要这样做(配置旨在开发和维护),因为相对路径import是相对于包含这些的模块的路径解析,而此处的 URL 是“blob”之一,具有其所有含义。 -
设置一个 cookie,我假设用户代理将包含对域的所有请求(当然,取决于 cookie 规范)。
最后,我可以通过在 URL 中使用的 URL 中提供授权承载(令牌)来解决这个问题。 import语句/调用中,但无论如何,出于安全原因,这是我绝对想要避免的一件事。
是否有任何惯用的方式,最好不涉及上述任何解决方案,以提供 Authorization在导入模块时标头,或任何超出特定用户代理模块加载器隐式标头?如果没有,您会认为上述任何解决方案在实践中都是可行的吗?
为了预先解决即将出现的XY 问题问题——我不清楚我实际上想要做什么 (Y),而是询问如何为import语句/调用 (X)指定标头:正如您可能已经猜到的那样,该模块可能包含一定数量的敏感信息,因此未经有效授权不应提供。该信息不包括密码或密钥,但可能包括可被误用于指纹识别或服务分析的个人信息,因此我们的安全团队对最好仅通过授权提供模块的次要要求。该模块充当应用程序的“配置器”,通过它本质上是一个脚本,我可以在模块能够配置的方式和内容方面保持几乎任意的灵活性。