已正确发送X-XSRF-Token请求头仍报Laravel CSRF令牌不匹配错误
Laravel Sanctum + Angular CSRF Token Mismatch 排查解决
按优先级排查以下配置项,绝大多数该类问题都能解决:
- 域名白名单配置
打开config/sanctum.php,找到stateful数组,把前端完整访问地址(包括端口,比如本地开发的localhost:4200、线上的frontend.example.com)加进去,Sanctum仅对该列表内的来源请求启用CSRF cookie校验逻辑,不在列表内的请求不会正确匹配token。 - Session域与跨域配置
- 打开
config/session.php:本地开发时domain项设为null即可,线上环境配置为前后端共用的根域名(比如.example.com,注意前面的点);same_site本地开发可设为lax,如果跨端口/跨子域调试可临时设为none,同时把secure项设为false,线上环境务必改回same_site=lax+secure=true。 - 如果使用
fruitcake/laravel-cors处理跨域,打开config/cors.php,把supports_credentials设为true,allowed_origins精确配置前端访问地址,不能用*通配符——带凭证的跨域请求不允许通配源配置。 - 所有配置修改完成后执行
php artisan config:clear清除配置缓存,避免旧配置生效。
- 打开
- Angular请求配置
- Angular默认的XSRF拦截器仅对同域请求生效,前后端跨域/跨端口部署时需要手动在根模块配置拦截器:
// app.module.ts import { HttpClientXsrfModule } from '@angular/common/http'; @NgModule({ imports: [ // 其余原有导入 HttpClientXsrfModule.withOptions({ cookieName: 'XSRF-TOKEN', headerName: 'X-XSRF-TOKEN', }), ] }) export class AppModule { }- 请求
/sanctum/csrf-cookie接口时必须携带withCredentials: true参数,否则浏览器不会保存服务端下发的XSRF-TOKEN和laravel_session cookie:
this.http.get('http://your-laravel-domain/sanctum/csrf-cookie', { withCredentials: true }).subscribe(() => { // 后续登录/鉴权请求逻辑 })- 所有后续访问Laravel接口的请求,都要统一加上
withCredentials: true配置——如果不带该参数,请求不会携带laravel_session cookie,服务端无法将请求头里的XSRF token和session内存储的token做匹配,必然返回mismatch错误。
- Token编码问题
Laravel下发的XSRF-TOKEN cookie默认做了URL编码,Angular内置的XSRF拦截器会自动解码,如果是手动读取cookie拼接请求头,需要先用decodeURIComponent()处理cookie值再放入X-XSRF-TOKEN请求头,否则两边值不匹配。
问题现象参考
- 服务端正常返回XSRF-Token Cookie:

- 请求已携带X-XSRF-TOKEN请求头:

内容的提问来源于stack exchange,提问作者Tim Ferrill
相关产品推荐
相关产品推荐

