起因
起因是隔壁项目组在测试发现版本环境发起的请求没有携带 cookie 导致认证报错,第一反应是 fetch 请求的参数 option 里 credentials
没有配置导致的。查看代码发现确实没有配置 credentials
选项,但是奇怪的是开发环境相同代码没有该问题,怀疑是 Fetch API credentials 默认值有历史变更。果然查看差异发现开发环境浏览器是 Chrome v90,而版本环境浏览器是 Chrome v63。将版本环境浏览器更新,问题解决,为了兼容老版本浏览器,后续还需要将代码中 fetch 的 credentials
选项设置为 same-origin
或 include
。
开始考古,找了一圈,先说结论:
credentials
现在的默认值是same-origin
,原默认值为omit
- 2018 年 4 月标准变更
- 2018 年,Chrome 68、Firefox 61.0b13、Safari 12 开始支持该特性
- 若要兼容老版本浏览器,注意设置
credentials
考古过程痕迹:
1、MDN 的 3 个坑
坑1:文档参数说明没有说默认值
developer.mozilla.org/en-US/docs/…
坑2:关于这点在与 jQuery 的区别里提到,而且中英文文档不一致(中文文档没有这部分):
developer.mozilla.org/en-US/docs/…
在这里也提了一嘴
developer.mozilla.org/en-US/docs/…
这块中文文档倒是有,但是内容还是不一致:
developer.mozilla.org/zh-CN/docs/…
2、看看标准
该标准变更的 PR:Make fetch() use "same-origin" credentials by default
3、Chrome 考古
在这里 chromestatus.com/features 可以查看 Chrome 全部特性
chromestatus.com/features#cr…:
Feature: Fetch API: Credentials mode default to "same-origin":