You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向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:包含Authorization
  • Access-Control-Allow-Methods:包含OPTIONS和POST

内容的提问来源于stack exchange,提问作者José André Pereira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 03:48:05