Laravel Sanctum CSRF保护配置疑问:未触发Token校验异常
Laravel Sanctum CSRF保护问题解析
核心逻辑:Sanctum的CSRF校验只针对特定场景
Sanctum的CSRF保护并非对所有auth:sanctum路由强制校验,它只针对浏览器发起的跨域会话请求——也就是当你的SPA通过Cookie维持登录会话时,才会强制要求请求携带XSRF-Token请求头。
Postman这类非浏览器客户端不在这个校验范围内,因为Sanctum默认认为这类请求会使用API令牌(Bearer Token)做认证,而非会话Cookie+CSRF的组合模式,所以不会触发CSRF Token Mismatch异常。
验证配置是否正确的步骤
- 用SPA实际测试:在你的SPA中发起跨域请求,故意不携带
XSRF-Token,此时应该触发CSRF错误,这才说明保护生效。 - 检查Sanctum配置:
打开config/sanctum.php,确认stateful数组包含你的SPA域名,示例:
同时'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', 'localhost:3000,127.0.0.1:3000')),.env文件里的SESSION_DOMAIN要设置正确:本地开发可设为localhost,线上同主域场景设为.yourdomain.com。 - 检查CORS配置:
打开config/cors.php,确保supports_credentials为true,allowed_origins包含你的SPA域名,allowed_headers中包含XSRF-TOKEN。
关于Postman能正常访问的额外说明
如果你的/user路由在auth:sanctum下但Postman能正常访问,大概率是以下两种情况:
- 请求使用了API令牌(比如请求头携带
Authorization: Bearer {token}),此时Sanctum用令牌认证,不校验CSRF。 login路由本身未添加auth:sanctum中间件,它的作用是生成会话或令牌,本身不需要CSRF保护,所以无Token也能正常响应。
内容的提问来源于stack exchange,提问作者Jheems
相关产品推荐
相关产品推荐

