Laravel自定义API中间件兼容Sanctum Cookie与Bearer Token授权
修改后的自定义中间件代码
public function handle(Request $request, Closure $next): Response { // 通过Sanctum Guard自动处理Bearer Token或Cookie认证 $authenticatedUser = Auth::guard('sanctum')->user(); if ($authenticatedUser) { // 将认证用户设置到默认Auth实例,供后续业务逻辑使用 Auth::setUser($authenticatedUser); } return $next($request); }
代码说明
原中间件仅在请求携带Bearer Token时才尝试获取认证用户,而Laravel Sanctum的sanctum Guard本身已经内置了两种认证方式的支持:
- 优先检查请求头中的
Authorization: Bearer {token} - 若没有Token,则自动校验Cookie中的Laravel会话凭证(需请求携带
laravel_sessionCookie和正确的X-XSRF-TOKEN请求头)
直接调用Auth::guard('sanctum')->user()会让Sanctum自动完成上述两种认证逻辑,无需手动判断请求头。只要认证成功,就将用户设置到默认Auth实例,确保后续接口能通过Auth::user()获取当前用户。
网站端Axios配置补充
你的现有Axios配置需要调整两处,才能确保Cookie认证正常工作:
- 移除
Access-Control-Allow-Origin: *:当请求携带凭证(withCredentials: true)时,浏览器不允许跨域源为通配符,需指定具体前端域名 - 自动携带XSRF Token:Sanctum要求非GET请求携带
X-XSRF-TOKEN请求头,可通过拦截器自动获取Cookie中的Token
调整后的Axios代码:
const instance = axios.create({ timeout: 2000, withCredentials: true, headers: { 'Content-Type': 'application/json' } }); // 添加请求拦截器自动携带XSRF Token instance.interceptors.request.use(config => { const xsrfToken = document.cookie.match(/XSRF-TOKEN=([^;]+)/)?.[1]; if (xsrfToken) { config.headers['X-XSRF-TOKEN'] = decodeURIComponent(xsrfToken); } return config; }); instance .post("/api/products", { data: example_data }) .then(response => { console.log(response.data) });
后端CORS配置验证
确保config/cors.php中以下配置正确:
return [ 'paths' => ['api/*', 'sanctum/csrf-cookie'], 'allowed_methods' => ['*'], 'allowed_origins' => ['http://your-frontend-domain.test'], // 替换为你的前端实际域名 'allowed_headers' => ['*'], 'supports_credentials' => true, // 必须开启,允许携带Cookie ];
内容的提问来源于stack exchange,提问作者Александр Инженер
相关产品推荐
相关产品推荐

