Laravel 5.6中Auth::guard('api')->user()返回null问题求助
咱们一步步来排查这个Auth::guard('api')->user()返回null的问题,这在Laravel 5.6的token认证场景里,通常是几个关键环节出了问题:
检查用户表是否存在
api_token字段
首先得确认你的用户表(默认是users)里有api_token字段,类型建议是varchar(80)并且设置为唯一。如果没有的话,需要创建迁移添加这个字段:Schema::table('users', function (Blueprint $table) { $table->string('api_token', 80)->unique()->nullable()->default(null); });运行迁移后,记得给需要认证的用户生成并保存一个唯一的api_token(可以用
Str::random(60)生成)。确认请求中正确携带了api_token
Laravel 5.6的token认证默认支持两种传递方式:- URL参数:比如
http://your-domain/api/user/profile?api_token=你的用户token - 请求头:使用标准的
Authorization: Bearer 你的用户token格式(部分旧场景也支持直接传token,但推荐用Bearer规范)
一定要确保传递的token和数据库中用户的api_token完全一致,没有空格、大小写错误或者截断的情况。
- URL参数:比如
检查路由是否配置了正确的中间件
你的API路由需要确保已经应用了auth:api中间件——要么在路由定义时单独添加,要么放在包含该中间件的路由组里:// 单独给路由添加中间件 Route::get('/user/profile', 'UserController@getUserProfile')->middleware('auth:api'); // 或者放在路由组里 Route::middleware(['api', 'auth:api'])->group(function () { Route::get('/user/profile', 'UserController@getUserProfile'); });虽然你在方法里手动调用了
Auth::guard('api')->check(),但正确配置中间件能确保认证逻辑被正确触发,也能避免手动判断的疏漏。验证认证配置文件的正确性
打开config/auth.php,检查guards下的api配置是否正确:'guards' => [ 'api' => [ 'driver' => 'token', 'provider' => 'users', ], ],要保证
driver是token,provider指向正确的用户提供者(默认是users),同时确认providers部分的users配置指向你的User模型。检查User模型的继承关系
确保你的User模型继承了Laravel的Authenticatable类,它已经实现了认证所需的接口:use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { // 模型内容 }如果是自定义模型,千万别漏掉这个继承。
清除配置和路由缓存
有时候缓存会导致配置不生效,运行以下命令清除缓存:php artisan config:clear php artisan route:clear
另外,顺便提一句:你代码里认证失败时返回的状态码是200,这不符合HTTP规范,认证失败应该返回401状态码,这样前端能更准确地处理错误场景,修改后的代码示例:
return response()->json([ 'errors' => ['status' => 401, 'detail' => 'Authentication error.'], 'success' => false ], 401);
内容的提问来源于stack exchange,提问作者Ishaque Javed

