向Kong API网关发起Basic Auth请求报CORS错误及预检请求404问题
问题根因
你遇到的是带自定义认证头的跨域请求触发了浏览器预检机制,Kong网关未正确处理OPTIONS预检请求导致的问题:
- 带
Authorization头的POST请求属于非简单请求,浏览器会先发送OPTIONS预检请求校验跨域权限 - 不走网关时预检请求直接被Spring Boot的
@CrossOrigin处理,请求正常;走Kong时预检请求先到达Kong,不会转发到后端服务,Kong的CORS配置不满足要求时会直接拒绝请求
排查&解决步骤
1. 修正Kong CORS插件核心配置
你的现有配置缺少2个必填项,按以下规则调整:
- 必须在
允许的请求头列表中显式加入Authorization,不能仅用默认配置 - 必须在
允许的请求方法列表中加入OPTIONS,否则预检请求直接被拦截 - 因为请求携带认证凭证(Basic Auth头),
允许的来源(origins)不能配置为通配符*,必须指定前端的实际域名(多域名可配置多个条目) - 开启
credentials配置,允许跨域请求携带凭证 - 关闭
preflight_continue,让Kong直接处理预检请求,不需要转发到后端和Spring Boot的跨域配置冲突
对应kong.yaml 1.1版本的配置示例:
plugins: - name: cors config: origins: - "http://localhost:8080" # 替换为你前端实际访问地址,生产环境填正式域名 methods: - GET - POST - PUT - DELETE - PATCH - OPTIONS # 必须保留OPTIONS方法 headers: - Accept - Content-Type - Authorization # 必须显式添加Authorization头 exposed_headers: - Content-Length credentials: true max_age: 3600 preflight_continue: false
2. 排查Kong认证插件拦截问题
如果你给/api/client/authenticate路由绑定了Kong自带的Basic Auth等认证插件,会出现以下问题:
- 预检OPTIONS请求不会携带
Authorization头,会被Kong的认证插件直接返回401,导致预检失败
解决方法:
给对应认证插件配置anonymous参数,允许匿名访问的请求(即OPTIONS预检请求)通过,再由后续逻辑处理权限,或者在路由层配置规则跳过OPTIONS请求的认证校验。
3. 验证配置生效
修改配置后重载Kong配置:
# 容器部署的Kong执行以下命令,替换为你的Kong容器名 docker exec -it <kong容器名> kong reload
清理浏览器缓存后重新发起请求,检查网络面板中OPTIONS预检请求的返回状态码是否为200,返回头是否包含以下字段:
Access-Control-Allow-Origin:值为你的前端域名Access-Control-Allow-Headers:包含AuthorizationAccess-Control-Allow-Methods:包含OPTIONS和POST
内容的提问来源于stack exchange,提问作者José André Pereira
相关产品推荐
相关产品推荐

