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

已正确发送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域与跨域配置
    1. 打开config/session.php:本地开发时domain项设为null即可,线上环境配置为前后端共用的根域名(比如.example.com,注意前面的点);same_site本地开发可设为lax,如果跨端口/跨子域调试可临时设为none,同时把secure项设为false,线上环境务必改回same_site=lax+secure=true。
    2. 如果使用fruitcake/laravel-cors处理跨域,打开config/cors.php,把supports_credentials设为true,allowed_origins精确配置前端访问地址,不能用*通配符——带凭证的跨域请求不允许通配源配置。
    3. 所有配置修改完成后执行php artisan config:clear清除配置缓存,避免旧配置生效。
  • Angular请求配置
    1. 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 { }
    
    1. 请求/sanctum/csrf-cookie接口时必须携带withCredentials: true参数,否则浏览器不会保存服务端下发的XSRF-TOKEN和laravel_session cookie:
    this.http.get('http://your-laravel-domain/sanctum/csrf-cookie', {
      withCredentials: true
    }).subscribe(() => {
      // 后续登录/鉴权请求逻辑
    })
    
    1. 所有后续访问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:
    返回的XSRF-Token Cookie
  • 请求已携带X-XSRF-TOKEN请求头:
    已发送的X-XSRF-Token请求头

内容的提问来源于stack exchange,提问作者Tim Ferrill

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 07:54:24