You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel自定义API中间件兼容Sanctum Cookie与Bearer Token授权

如何让自定义API中间件同时兼容Sanctum的Bearer Token和Cookie授权?

修改后的自定义中间件代码

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本身已经内置了两种认证方式的支持:

  1. 优先检查请求头中的Authorization: Bearer {token}
  2. 若没有Token,则自动校验Cookie中的Laravel会话凭证(需请求携带laravel_session Cookie和正确的X-XSRF-TOKEN请求头)

直接调用Auth::guard('sanctum')->user()会让Sanctum自动完成上述两种认证逻辑,无需手动判断请求头。只要认证成功,就将用户设置到默认Auth实例,确保后续接口能通过Auth::user()获取当前用户。

网站端Axios配置补充

你的现有Axios配置需要调整两处,才能确保Cookie认证正常工作:

  1. 移除Access-Control-Allow-Origin: *:当请求携带凭证(withCredentials: true)时,浏览器不允许跨域源为通配符,需指定具体前端域名
  2. 自动携带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,提问作者Александр Инженер

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 00:07:31