Laravel Sanctum请求auth:sanctum接口报错Route [login] not defined如何解决
错误产生原因
- 身份校验触发默认重定向逻辑:你请求
/api/user接口时未携带有效的Sanctum身份凭证(正确的Token/跨域请求未携带合法会话Cookie),auth:sanctum中间件校验失败后,Laravel默认会将未认证请求重定向到命名路由login。 - 缺少对应命名路由:
routes/api.php内定义的路由默认携带/api前缀,你未在API路由组中定义名为login的路由,也没有修改未认证请求的响应逻辑,因此直接抛出路由不存在异常。
解决方案
根据你使用的Sanctum认证模式选择对应处理方案:
方案1:Token模式(前后端完全分离、移动端API场景)
- 新增登录接口并设置
login路由名,解决路由不存在报错,同时生成Sanctum Token返回给前端,示例代码(写入routes/api.php):
use App\Models\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; use Illuminate\Validation\ValidationException; Route::post('/login', function (Request $request) { $request->validate([ 'email' => 'required|email', 'password' => 'required', ]); $user = User::where('email', $request->email)->first(); if (! $user || ! Hash::check($request->password, $user->password)) { throw ValidationException::withMessages([ 'email' => ['登录凭证错误'], ]); } // 生成接口访问Token返回给前端 return [ 'code' => 200, 'token' => $user->createToken('common-api-token')->plainTextToken ]; })->name('login');
- Postman调试时,先调用
/api/login接口拿到Token,之后请求/api/user时,在请求头添加两个参数即可:Accept: application/json(告诉Laravel返回JSON格式响应,不触发跳转)Authorization: Bearer 你刚才获取的Token(携带身份凭证通过校验)
方案2:会话Cookie模式(同域Laravel+Vue SPA单页应用场景)
- 修改未认证请求的响应逻辑,打开
app/Http/Middleware/Authenticate.php,修改redirectTo方法:
protected function redirectTo(Request $request): ?string { // 仅非JSON请求才跳转登录页,JSON请求直接返回401 return $request->expectsJson() ? null : route('login'); }
- 前端请求配置:Vue端请求库(如Axios)开启
withCredentials = true,登录前先请求/sanctum/csrf-cookie初始化CSRF凭证,后续请求会自动携带会话Cookie通过Sanctum校验,示例代码:
import axios from 'axios' axios.defaults.withCredentials = true // 登录流程示例 async function login(loginForm) { // 先初始化CSRF Cookie await axios.get('/sanctum/csrf-cookie') // 再提交登录请求 await axios.post('/login', loginForm) // 后续请求/api/user自动携带凭证 }
- 确认配置项:
config/sanctum.php的stateful配置已添加前端域名(含端口号),config/cors.php的supports_credentials设置为true。
内容的提问来源于stack exchange,提问作者Moemen Hussein
相关产品推荐
相关产品推荐

