求助:未登录状态 Ajax 请求出现 “CSRF token mismatch.” 错误!

laravel5.8,权限认证使用的是默认的auth包。登录状态下ajax请求能够正常运行,一旦登录过期,那么ajax请求不是返回的未登录错误,而直接是“CSRF token mismatch.”,请求时,header和postfields中都有CSRF token信息,但还是报错。请大声指教。

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
最佳答案

可以把 $middlewareGroups 数组中的 AuthenticateSession 过滤器的注释去掉,使之有效。这样应该就是你要的效果了。但是为什么框架默认是注释的,我要在看看。

4年前 评论
moocky (楼主) 4年前
24K大白羊 (作者) 4年前
tian_success 4年前
讨论数量: 6

页面多处使用csrf,出现的问题

4年前 评论
moocky (楼主) 4年前
kangfq 4年前

@moocky 重新捋了一下 知道了为什么会出现这个问题

App\Http\Kernel.php 文件的 $middlewareGroups 数组下的 web 是这个路由下所有的请求都要走的过滤器。
走完这些过滤器,才会走 auth 对应的过滤器。

那么也就知道了为什么会先报 CSRF token mismatch. 的异常,而不是先提示登录过期的问题了。

4年前 评论

可以把 $middlewareGroups 数组中的 AuthenticateSession 过滤器的注释去掉,使之有效。这样应该就是你要的效果了。但是为什么框架默认是注释的,我要在看看。

4年前 评论
moocky (楼主) 4年前
24K大白羊 (作者) 4年前
tian_success 4年前

@moocky 原因已经调查清楚了,还是执行过滤器顺序问题导致的,具体可以看这个帖子CSRF过滤器执行顺序

为什么把 AuthenticateSession 注释去掉就好用了呢?

这个和 $middlewarePriority 数组有关系,当 AuthenticateSession 有效后,会通过排序机制将 Authenticate 过滤器放置在 VerifyCsrfToken 之前执行,所以就不会有问题了。调整登录页面不是 AuthenticateSession 过滤器做的工作,这也是调查比较费时间的地方。

4年前 评论

没仔细看你说的啥,laravel 的VerifyCsrfToken中间件里面是可以配置哪些不需要csrf的

4年前 评论

@24K大白羊 按你的方法,還是不行

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!