Spring Boot微服务问题:添加Auth服务后网关请求报CSRF令牌缺失403错误
问题描述
在通过API网关向其他服务发送请求时出现异常,添加Auth服务后触发403 Forbidden错误,具体提示:
An expected CSRF token cannot be found (403 Forbidden)
需求是完成身份验证后可向其他服务发送任意请求,推测问题出在API网关,但无法定位解决。
环境准备命令
启动所有服务前,需在Docker中运行Zipkin和Redis,执行以下命令:
docker run -d -p 9411:9411 openzipkin/zipkin docker run -d --name redis -p 6379:6379 redis
解决方案
针对API网关出现的CSRF令牌缺失问题,可根据服务架构选择以下方案:
方案一:关闭服务间调用的CSRF防护
若API网关仅用于服务间通信(非面向浏览器前端),可直接关闭CSRF防护。在Spring Security配置类中添加如下代码:@Configuration public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.csrf(csrf -> csrf.disable()); // 关闭CSRF防护 // 其他身份验证相关配置 return http.build(); } }方案二:配置CSRF忽略路径
若需保留部分路径的CSRF防护,可针对服务间调用的路径添加忽略规则:@Configuration public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.csrf(csrf -> csrf .ignoringRequestMatchers("/api/**") // 忽略指定前缀的服务间调用路径 ); // 其他身份验证相关配置 return http.build(); } }方案三:传递CSRF令牌
若必须保留CSRF防护,需在请求中携带CSRF令牌:- 从Auth服务获取CSRF令牌(可通过登录接口返回或
/csrf端点获取) - 在后续请求的请求头中添加
X-XSRF-TOKEN,值为获取到的令牌 - 确保API网关和下游服务均配置了CSRF令牌的解析规则
- 从Auth服务获取CSRF令牌(可通过登录接口返回或
额外排查要点
- 检查API网关的Spring Security配置,确认添加Auth服务后是否自动启用了CSRF防护
- 验证下游服务是否开启CSRF防护,服务间调用无需该防护的话建议统一关闭
- 查看请求日志,确认请求是否携带正确的身份验证信息(如JWT令牌),避免因身份验证失败被误判为CSRF问题
内容的提问来源于stack exchange,提问作者Sercan Noyan Germiyanoğlu
相关产品推荐
相关产品推荐

