FastAPI已配置允许所有跨域仍报CORS错误,是否与自定义Signature头有关
问题原因
- 自定义的
Signature请求头是触发问题的直接原因:这类非标准请求头会让浏览器判定当前请求为非简单请求,会优先发送OPTIONS预检请求校验跨域权限。 - 核心配置漏洞:CORS规范明确要求,当跨域请求携带凭证(对应你配置的
allow_credentials=True)时,Access-Control-Allow-Headers、Access-Control-Allow-Origin响应头不允许使用通配符*,哪怕后端配置了allow_headers=["*"],浏览器也不会将其识别为允许所有请求头,必须显式声明允许的请求头值。
解决方案
修改FastAPI跨域配置,将用到的所有请求头显式加入allow_headers列表即可,示例代码如下:
api.add_middleware( CORSMiddleware, allow_origin_regex=".*", allow_credentials=True, allow_methods=["*"], # 显式列出所有允许的请求头,包含自定义的Signature和默认的Content-Type等 allow_headers=["Content-Type", "Signature"] )
注:这里
allow_origin_regex=".*"是生效的,因为FastAPI的CORSMiddleware会匹配请求的Origin字段,匹配通过后会直接将请求的Origin值作为Access-Control-Allow-Origin的响应值返回,不会返回通配符*,符合带凭证请求的CORS规则。
验证方式
配置修改完成后,在浏览器网络面板查看OPTIONS预检请求的响应头,确认Access-Control-Allow-Headers字段中包含Signature值即可正常发起请求。
内容的提问来源于stack exchange,提问作者Efaz
相关产品推荐
相关产品推荐

