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

Laravel Sanctum与auth:web配置及认证方式等技术疑问

Laravel Sanctum 问题解答

问题1:Sanctum配置中guard设为web,已登录用户仍无法访问auth:sanctum路由?

你的理解存在部分偏差:Sanctum配置里的guard数组确实指定了认证时优先检查的守卫,但仅当请求被识别为「状态化请求」时,Sanctum才会尝试用这些守卫的会话进行认证。

要让已登录的Web用户访问auth:sanctum保护的路由,需要满足三个前提:

  • 请求需来自同域或config/sanctum.php中stateful配置的可信域名;
  • 请求所在的路由组必须包含EnsureFrontendRequestsAreStateful中间件(通常api路由组默认已包含),或手动为路由添加该中间件;
  • 前端发起请求时,需携带XSRF-TOKEN Cookie对应的请求头(如X-XSRF-TOKEN),这是Laravel CSRF保护的要求。

如果缺少上述条件,Sanctum会跳过Web守卫的会话检查,仅尝试通过Bearer Token认证,导致已登录用户被判定为未认证。

问题2:如何让路由同时支持Bearer Token和会话Cookie认证?

要实现双认证方式,需按以下步骤调整:

  1. 将目标路由放入api中间件组(该组默认包含EnsureFrontendRequestsAreStateful),或手动为路由添加该中间件;
  2. 仍使用auth:sanctum作为路由的认证中间件;
  3. 解决浏览器重定向问题:
    • 浏览器中出现重定向,是因为当Sanctum无法通过会话认证时,会触发Web守卫的默认未认证响应(重定向到登录页或HOME路由)。需确保前端请求满足「状态化请求」条件(同域+携带XSRF头),此时Sanctum会优先检查Web会话,已登录用户即可正常访问;
    • 若需要针对API返回JSON而非重定向,可自定义auth:sanctum的未认证响应:在app/Exceptions/Handler.php中重写unauthenticated方法,判断请求是否为API请求,返回JSON响应。

示例路由配置:

Route::middleware(['api', 'auth:sanctum'])->group(function () {
    // 你的受保护路由
});

问题3:EnsureFrontendRequestsAreStateful中间件的作用是什么?

该中间件是Sanctum实现「会话Cookie认证」的核心,作用包括:

  • 识别状态化请求:判断请求是否来自同域或config/sanctum.php中stateful配置的可信域名,将这类请求标记为「状态化」;
  • 启用会话认证:对于状态化请求,Sanctum会优先使用配置中guard数组指定的守卫(如web)检查用户会话,无需传递Bearer Token;
  • 处理CSRF保护:自动验证状态化请求的XSRF令牌,确保请求的安全性;
  • 维护会话状态:让前端请求可以复用Laravel的Web会话,实现已登录用户无缝访问API路由。

将该中间件添加到api路由组后,同域前端的请求即可通过会话Cookie完成认证,无需额外携带Token。


内容的提问来源于stack exchange,提问作者gamedev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 10:05:09