Spring Cloud Gateway浏览器请求无法授权JWT Token问题求助
问题排查与解决方案
核心问题1:WebFlux与Servlet安全配置冲突
你同时定义了适用于Spring Cloud Gateway(WebFlux环境)的SecurityWebFilterChain,以及Servlet环境的SecurityFilterChain,两者会互相干扰。后者不仅禁用了CORS,还设置了全局请求放行,直接覆盖了WebFlux的JWT校验逻辑,导致浏览器请求的Authorization头无法被正确识别校验。
解决方法:删除额外的SecurityFilterChain Bean,仅保留WebFlux的安全配置。
核心问题2:CORS配置违规
你的CORS配置同时设置了allowedOrigins: "*"和allowCredentials: true,这在浏览器环境下是不允许的——当请求携带凭证(比如Authorization头、Cookie)时,allowedOrigins不能使用通配符,必须指定具体的前端域名。
修改CORS配置:
- 调整
application.yml中的全局CORS配置:
spring: cloud: globalcors: corsConfigurations: '[/**]': allowedOrigins: "http://localhost:3000" # 替换为你的React前端实际地址 allowedMethods: "*" allowedHeaders: "*" allowCredentials: true
- 同步修改Java代码中的CORS配置,保持一致:
@Bean CorsConfigurationSource corsConfiguration() { CorsConfiguration corsConfig = new CorsConfiguration(); corsConfig.setAllowedOrigins(Arrays.asList("http://localhost:3000")); // 填写具体前端域名 corsConfig.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS")); corsConfig.setAllowedHeaders(Arrays.asList("*")); corsConfig.setAllowCredentials(true); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", corsConfig); return source; }
核心问题3:TokenRelay过滤器误用
TokenRelay过滤器是用于OAuth2客户端模式,作用是将客户端获取的令牌转发到下游服务,但你的网关是作为OAuth2资源服务器(通过JWT直接校验令牌),这个过滤器在这里完全没用,反而可能干扰请求头处理。
解决方法:从路由的过滤器配置中移除TokenRelay=项。
额外检查点
- 确认React请求中正确携带Authorization头,格式必须是
Bearer {token},注意大小写和空格:
// React请求示例 fetch('/customer-service/v1.0/xxx', { method: 'GET', headers: { 'Authorization': 'Bearer ' + yourJwtToken } })
- 打开浏览器控制台的Network面板,检查请求的Authorization头是否被正常发送,是否有CORS相关的错误提示。
- 验证Keycloak颁发的JWT令牌,确保
iss(颁发者)字段与网关配置的issuer-uri完全匹配,且令牌未过期。
内容的提问来源于stack exchange,提问作者Cia Kazemi
相关产品推荐
相关产品推荐

