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

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

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

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

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

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

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

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

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

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

5年前 评论

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

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

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

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

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

5年前 评论

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

5年前 评论

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

4年前 评论

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