测试Laravel的/user接口时出现Route [login]未定义错误求助
问题:Laravel Sanctum 保护的 /user 接口抛出 Route [login] 未定义错误
测试Postman调用GET /user接口时,返回错误:
<!DOCTYPE html> <html lang="en" class="auto"> <!-- Symfony\Component\Routing\Exception\RouteNotFoundException: Route [login] not defined. in file C:\Users\USER\project-blogapp\vendor\laravel\framework\src\Illuminate\Routing\UrlGenerator.php on line 479
期望获取数据库用户信息,但错误持续出现。
用户提供的代码
路由代码
//public routes Route::post('/register', [Authcontroller::class, 'register']); Route::post('/login', [Authcontroller::class, 'Login']); Route::group(['middleware' => 'auth:sanctum'], function () { //user Route::get('/user', [Authcontroller::class, 'user']); Route::put('/user', [Authcontroller::class, 'Update']); Route::post('/logOut', [Authcontroller::class, 'logOut']); //post Route::get('/posts', [postController::class, 'index']); //all posts Route::post('/posts', [postController::class, 'store']); //create posts Route::get('/posts/{id}', [postController::class, 'show']); //single posts Route::put('/posts/{id}', [postController::class, 'update']); //update Route::delete('/posts/{id}', [postController::class, 'destroy']); //destroy //comments Route::get('/posts/{id}/comments', [commentController::class, 'index']); //all posts Route::post('/posts/{id}/comments', [commentController::class, 'store']); //create posts Route::put('/comments/{id}', [commentController::class, 'update']); //update Route::delete('/comments/{id}', [commentController::class, 'destroy']); //destroy //likes Route::post('/posts/{id}/likes', [likeController::class, 'likeOrUnlike']); //like or dislike a post });
AuthController 代码
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use App\Models\User; class Authcontroller extends Controller { public function register(Request $request) { $attr = $request->validate([ 'name' => 'required|string', 'email' => 'required|email|unique:users,email', 'password' => 'required|min:6|confirmed', ]); $user = User::create( [ 'name' => $attr['name'], 'email' => $attr['email'], 'password' => bcrypt($attr['password']), ] ); //return response return response([ 'user' => $user, 'token' => $user->createToken('secret')->plainTextToken, ]); } //LOGIN USER public function Login(Request $request) { $attr = $request->validate([ 'email' => 'required|email', 'password' => 'required|min:6', ]); if (!Auth::attempt($attr)) { return response( [ 'message' => 'INVALID CREDENTIALS' ], 403 ); } //return response return response([ 'user' => auth()->user(), 'token' => auth()->user()->createToken('secret')->plainTextToken, ], 200); } //logout user public function logOut(Request $request) { auth()->user()->token()->delete(); return response(['message' => 'logout success']); } //get user details public function user() { return response(['user' => auth()->user()], 200); } public function Update(Request $request) { $attrs = $request->validate(['name' => 'required|String']); $image = $this->saveImage($request->image, 'profile'); auth()->user()->update([ 'name' => $attrs['name'], 'image' => $image ]); return response([ 'message' => 'user updated', 'user' => auth()->user() ], 200); } }
问题原因与解决方法
这个错误的核心原因是:auth:sanctum中间件检测到用户未认证时,默认会尝试跳转到命名为login的路由,但你的项目仅定义了/loginPOST接口,没有给它设置login路由名称,也未配置API场景下的未授权响应行为。
解决步骤
确保请求携带正确的 Sanctum Token
- 先调用
POST /login或POST /register接口获取返回的plainTextToken - 在Postman的
GET /user请求中,添加请求头:Authorization: Bearer {你的token}(注意Bearer与token之间有空格)
- 先调用
配置API认证的未授权响应(优化错误提示)
- 打开
app/Exceptions/Handler.php,添加或修改render方法,处理API请求的未授权情况:use Illuminate\Auth\AuthenticationException; public function render($request, Throwable $exception) { if ($request->is('api/*') && $exception instanceof AuthenticationException) { return response()->json(['message' => 'Unauthorized'], 401); } return parent::render($request, $exception); }
- 打开
可选:给登录路由命名(避免其他场景的路由查找错误)
- 修改登录路由定义,添加名称:
Route::post('/login', [Authcontroller::class, 'Login'])->name('login');
- 修改登录路由定义,添加名称:
验证步骤
- 清理路由缓存:执行
php artisan route:clear - 再次用Postman发送
GET /user请求,确保请求头包含正确的Bearer Token - 若未携带Token,此时会返回
401 Unauthorized的JSON响应,而非之前的路由错误
内容的提问来源于stack exchange,提问作者Allan
相关产品推荐
相关产品推荐

