请求es2015模块文件时Safari不包含cookie

时间:2019-06-20 14:38:02

标签: cookies ecmascript-6 safari

我的网络服务器要求在提供任何文件(包括.js文件)之前必须先提供身份验证cookie。

自从更新我的网站之一以在<script type="module">标签中提供es2015模块以来,Safari并未与该文件的请求一起发送身份验证cookie。它可以在Chrome浏览器中正常运行。

Safari中是否存在阻止js模块请求中的cookie的行为?我可以回滚到不支持模块以恢复服务,但是对于支持它们的浏览器,则失去模块的好处。

<script src="module.js" type="module"></script>
<script src="legacy.js" nomodule></script>
---
<script src="legacy.js"></script>

在请求js文件的页面的服务器响应标头中设置了第一方cookie。 当出现前两个脚本标签时,Safari不会按预期方式请求module.js,而不是legacy.js,但该请求中不包含任何cookie。 如果改用第三个脚本标签,则Safari会请求legacy.js,包括带有该请求的cookie。

有没有办法让Safari与模块请求一起发送cookie? 其他浏览器会采用Safari的行为吗? ECMAScript 6规范是否在此以一种或另一种方式规定了行为?

1 个答案:

答案 0 :(得分:0)

模块脚本及其依赖性通过CORS获取。 这意味着任何跨域模块脚本都必须带有适当的标头,例如Access-Control-Allow-Origin:*。 当然,对于经典脚本而言并非如此。

目前看来可行的一个选项是在脚本上添加类型模块属性

<script src="[...].js" type="module" crossorigin="use-credentials"></script>
  

默认情况下(即未指定属性时),CORS未设置   完全使用。 “匿名”关键字表示不会有   通过cookie,客户端SSL证书交换用户凭证   或HTTP身份验证,除非它来自同一来源。

     

在提取清单时必须使用use-credentials值   即使文件来自同一来源,也需要凭据。   https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes