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

测试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场景下的未授权响应行为。

解决步骤

  1. 确保请求携带正确的 Sanctum Token

    • 先调用POST /login或POST /register接口获取返回的plainTextToken
    • 在Postman的GET /user请求中,添加请求头:Authorization: Bearer {你的token}(注意Bearer与token之间有空格)
  2. 配置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);
      }
      
  3. 可选:给登录路由命名(避免其他场景的路由查找错误)

    • 修改登录路由定义,添加名称:
      Route::post('/login', [Authcontroller::class, 'Login'])->name('login');
      

验证步骤

  • 清理路由缓存:执行php artisan route:clear
  • 再次用Postman发送GET /user请求,确保请求头包含正确的Bearer Token
  • 若未携带Token,此时会返回401 Unauthorized的JSON响应,而非之前的路由错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:44:50