如何在Laravel中认证Vue.js/Axios发起的API路由请求?
解决Laravel 5.6中Vue+Axios调用带Auth中间件的API出现401的问题
你遇到的是前端请求无法通过API认证的典型场景,我来帮你梳理几个关键的解决方向:
1. 确认认证Guard的选择
Laravel的auth中间件默认在api.php路由里使用api guard(依赖token认证),而你的Blade模板属于web会话环境(依赖session cookie)。如果你的前端是和后端同域的Blade+Vue,优先考虑用web guard来认证API请求:
修改你的API路由定义,把auth:api换成auth:web:
Route::middleware('auth:web')->group(function () { // 你的API路由,比如: Route::get('/user/profile', 'UserController@profile'); });
这样就能让已登录的用户通过会话cookie直接访问API,不需要额外的token。
2. 确保Axios带上CSRF令牌
因为是同域请求,Laravel的web会话会校验CSRF令牌,你需要在请求头里带上它:
首先在Blade模板的<head>里添加CSRF meta标签:
<meta name="csrf-token" content="{{ csrf_token() }}">
然后在你的Vue入口文件(比如resources/js/app.js)里全局配置Axios:
import axios from 'axios'; // 全局设置CSRF令牌 axios.defaults.headers.common['X-CSRF-TOKEN'] = document.querySelector('meta[name="csrf-token"]').content; // 开启凭证携带(确保session cookie被传递) axios.defaults.withCredentials = true; window.axios = axios;
3. 如果坚持用API Guard(Token认证)
如果你需要用api guard,推荐用Laravel Passport的CreateFreshApiToken中间件来简化第一方前端的认证:
步骤1:启用中间件
在app/Http/Kernel.php的web中间件组里添加该中间件:
protected $middlewareGroups = [ 'web' => [ // ...其他已有的中间件 \Laravel\Passport\Http\Middleware\CreateFreshApiToken::class, ], ];
步骤2:配置Axios
这个中间件会自动在会话cookie里注入API token,Axios请求时会自动带上Authorization: Bearer {token}头,你只需要确保Axios开启withCredentials即可(和上面的配置一致)。
这样你的API路由用auth:api中间件时,前端请求就能正常通过认证了。
4. 排查常见坑点
- 检查浏览器控制台的请求头,确认
X-CSRF-TOKEN和Cookie是否被正确发送 - 确保用户确实已登录(可以在Blade里用
{{ auth()->check() }}验证) - 如果是跨域场景,还需要在Laravel里配置CORS(不过你是从Blade发起,应该是同域,这个可以忽略)
内容的提问来源于stack exchange,提问作者jreikes
相关产品推荐
相关产品推荐

