Laravel+Vue.js(axios)调用带auth中间件的web路由返回401 Unauthenticated问题
首先检查axios是否开启了跨域携带Cookie配置
如果你的前端访问域名和后端服务域名不一致(包括端口不同、子域不同),需要在axios配置中添加withCredentials参数,在bootstrap.js里补充如下代码:window.axios.defaults.withCredentials = true;该配置会让axios请求时自动携带laravel_session等身份识别Cookie,web中间件依赖该Cookie识别登录状态。
核对Session配置是否匹配站点域名
打开config/session.php检查如下配置:domain参数需要和你实际访问的站点域名匹配,如果是跨子域访问需要配置为一级域名,例如主域是example.com、前端是app.example.com的情况,需要设置为.example.comsecure参数如果你的站点没有配置HTTPS,需要设置为false,否则Session Cookie只会在HTTPS请求下携带same_site参数建议设置为lax,避免跨站请求时Cookie被拦截
检查路由服务提供者的中间件配置
打开app/Providers/RouteServiceProvider.php,确认routes/web.php对应的路由组是否默认挂载了web中间件,正常配置如下:Route::middleware('web') ->group(base_path('routes/web.php'));如果没有挂载web中间件,Session、CSRF等逻辑都不会生效,自然无法识别登录状态。
验证auth守卫配置
打开config/auth.php检查默认守卫是否为web:'defaults' => [ 'guard' => 'web', 'passwords' => 'users', ],如果你使用了自定义守卫,需要在路由的
auth中间件中指定守卫,例如auth:admin。清除路由缓存
如果生产环境执行过路由缓存,修改路由后需要执行命令清除旧缓存:php artisan route:clear执行后可以用
php artisan route:list查看对应路由的中间件是否正确包含auth和web组。临时关闭AuthenticateSession中间件测试
你当前web中间件组中开启了AuthenticateSession,这个中间件会校验用户密码哈希是否和会话中存储的一致,如果登录后修改过用户密码、或者用户模型的密码字段被意外修改,就会触发401。可以先把该中间件注释掉测试是否恢复访问,如果确认是该中间件问题,登录后注意更新会话中的密码哈希即可。检查Session存储权限
如果使用文件驱动存储Session,需要确保storage/framework/sessions目录有读写权限;如果使用Redis等驱动,需要确认驱动连接正常,没有抛出连接异常。
内容的提问来源于stack exchange,提问作者Michel Gisenäel

