http - Access-Control-Max-Age 不适用于授权标头
问题描述
试图锻炼为什么 chrome 仍然触发预取请求,即使Access-Control-Max-Age
在与标头结合时已指定Authorization
。如果我删除Authorization
标头预检缓存按预期工作。
请求标头
:method: OPTIONS
:path: /v1/api
:scheme: https
accept: */*
accept-encoding: gzip, deflate, br
accept-language: en-GB,en-US;q=0.9,en;q=0.8,pt-BR;q=0.7,pt;q=0.6,fr;q=0.5
access-control-request-headers: authorization,content-type
access-control-request-method: POST
origin: https://null.jsbin.com
referer: https://null.jsbin.com/
sec-fetch-dest: empty
sec-fetch-mode: cors
sec-fetch-site: cross-site
响应标头
access-control-allow-credentials: true
access-control-allow-headers: *
access-control-allow-methods: OPTIONS,POST
access-control-allow-origin: *
access-control-max-age: 86400
content-length: 0
content-type: application/json
date: Wed, 04 Aug 2021 08:30:50 GMT
我正在慢慢研究这个文档https://fetch.spec.whatwg.org/#http-cors-protocol但看不出有任何理由Authorization
阻止预检缓存。
另外,顺便说一句。如果Authorization
不兼容,Access-Control-Max-Age
从安全的角度来看,将身份验证令牌包含在正文中而不是作为标头是一个坏主意吗?您可以假设,通过 TLS。
解决方案
由于我不完全清楚的原因,指定Access-Control-Allow-Headers: Authorization, *
“修复”事物并且Access-Control-Max-Age: 10
受到尊重。授权标头是一种边缘情况,必须由服务器
[0] [1] [2]明确列出
const buildHeaders = origin => {
return {
"Access-Control-Allow-Methods": "*",
// the key line
"Access-Control-Allow-Headers": "Authorization, *",
"Access-Control-Allow-Origin": "*",
"Access-Control-Max-Age": "10"
};
};
fastify.options("/", function(request, reply) {
reply
.code(200)
.headers(buildHeaders(request.headers.origin))
.send();
});
fastify.post("/", function(request, reply) {
reply
.code(200)
.headers(buildHeaders(request.headers.origin))
.header("Content-Type", "application/json; charset=utf-8")
.send({ hello: "world" });
});
const url = 'https://dynamic-past-deltadromeus.glitch.me/'
const opts = {
headers: {
'Content-Type': 'application/json',
'Authorization': 'asdf'
},
method: 'POST',
body: JSON.stringify({ message: 'ping' }),
}
fetch(url,opts)
源代码:
推荐阅读
- svn - SVN 结帐不识别 url 路径
- android - 为什么 SQLite 中的 RawQuery 只能在没有问号的情况下工作(Kotlin)
- ios - 如何在其内容大小上匹配水平collectionView Cell的宽度
- php - Ajax 返回 PHP 文本而不是解析代码
- python-3.x - 蟒蛇 | 通过IP地址检查网站是否存在
- css - 容器 Div 外的浮动 Div
- python - python子进程将文件从主机复制到容器
- reactjs - 当组件在子组件中接收道具时,进行 HTTP 调用的最佳位置是什么?
- c# - 在两个 foreach 循环中访问字符串数组列表
- node.js - 如果我将 express.static 包装在一个函数中,服务器将停止工作