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
相关产品推荐
相关产品推荐

