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

Laravel Sanctum中间件API路由失效及Auth guard错误求助

问题描述

运行代码时触发错误:

InvalidArgumentException: Auth guard [auth] is not defined.

已知错误源于config/sanctum.php的guards数组中添加了auth,但不清楚该替换成什么内容。

实际需求是通过Sanctum中间件完成API认证,获取登录用户ID,但目前控制器中的dd(auth()->user())返回null。


控制器代码

dd(auth()->user());

routes/api.php

Route::post('login', [UserController::class, 'Login'])->name('login');

Route::group(['prefix' => 'user'],function () {
   Route::group(['middleware' => ['user','auth:sanctum']], function () {
     Route::post('send-msg', [ChatController::class, 'store'])->name('send-msg');
     });
   }
);

Kernel.php

protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
        'api' => [
             \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];

    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'user' => \App\Http\Middleware\AuthUser::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
    ];

config/sanctum.php

'guard' => ['web','auth'],

config/auth.php

'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],
'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'api' => [
            'driver' => 'sanctum',
            'provider' => 'users',
        ],
    ],

'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class,
        ],
    ],

Http/Middleware/Authenticate.php

namespace App\Http\Middleware;
use Illuminate\Auth\Middleware\Authenticate as Middleware;

class Authenticate extends Middleware
{
    protected function redirectTo($request)
    {
        if (! $request->expectsJson()) {
            return route('login');
        }
    }
}

解决方案

1. 修复Sanctum配置中的守卫错误

config/sanctum.php里的guard数组只能填**config/auth.php中已定义的守卫名称**,你现在填了不存在的auth,直接替换成你的API守卫api即可:

'guard' => ['web', 'api'],

修改后执行配置缓存刷新:

php artisan config:clear

2. 确保API认证流程完整

要让auth()->user()返回正确数据,必须保证:

  • 登录接口Login方法中,验证用户成功后生成并返回Sanctum令牌,示例代码:
public function Login(Request $request)
{
    $credentials = $request->validate([
        'email' => 'required|email',
        'password' => 'required'
    ]);

    if (!Auth::attempt($credentials)) {
        return response()->json(['message' => '登录失败'], 401);
    }

    $user = Auth::user();
    $token = $user->createToken('API Token')->plainTextToken;

    return response()->json(['token' => $token]);
}
  • 前端请求时,必须在请求头中携带令牌:
Authorization: Bearer {你的令牌内容}

3. 明确指定API守卫(可选)

因为默认守卫是web,在API控制器中可以直接指定使用api守卫获取用户,避免混淆:

dd(auth('api')->user());

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 02:57:49