Laravel Sanctum 受保护路由加Accept头仍跳转登录页问题求助
Laravel Sanctum 路由保护后重定向到登录页解决方案
核心排查步骤
- 步骤0:确认路由位置
受Sanctum保护的API路由必须放在routes/api.php文件中,该文件默认会加api前缀且无web会话中间件,若放在routes/web.php中会默认触发web端的登录重定向逻辑。 - 步骤1:确认请求头完整配置
仅配置Accept: application/json不够,必须同时携带认证令牌头:
可通过curl命令直接测试验证头是否生效:Authorization: Bearer <用户登录后生成的Sanctum令牌>
若测试返回401而非重定向,说明重定向问题已解决,仅剩令牌有效性校验问题。curl -H "Accept: application/json" -H "Authorization: Bearer 你的有效令牌" 你的接口地址 - 步骤2:校验未认证异常处理逻辑
打开app/Exceptions/Handler.php,检查unauthenticated方法是否包含expectsJson()判断,默认正确逻辑如下:
若你自定义过该方法且移除了JSON请求判断,无论请求头配置如何都会触发重定向。protected function unauthenticated($request, AuthenticationException $exception) { return $request->expectsJson() ? response()->json(['message' => 'Unauthenticated.'], 401) : redirect()->guest(route('login')); } - 步骤3:核对Sanctum配置项
- 确认用户模型已引入
Laravel\Sanctum\HasApiTokenstrait,生成的令牌会存入personal_access_tokens表 - 若为前后端分离SPA场景,检查
.env中SANCTUM_STATEFUL_DOMAINS是否配置了前端域名,SESSION_DOMAIN是否包含根域名 - 若为纯第三方API调用场景,打开
app/Http/Kernel.php,检查api中间件组是否移除了Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful中间件,该中间件仅用于SPA的session认证,纯令牌API无需配置
- 确认用户模型已引入
- 步骤4:校验Auth配置
打开config/auth.php,确认guards项中sanctum配置正确:'guards' => [ // ...其他guard 'sanctum' => [ 'driver' => 'sanctum', 'provider' => 'users', ], ]
内容的提问来源于stack exchange,提问作者Paulin Kouame
相关产品推荐
相关产品推荐

