Laravel中JWT认证后auth()->user()返回null问题求助
问题:JWT验证后
auth()->user()返回空对象 我开发的API使用JWT做身份验证,已成功获取JWT token,但调用auth()->user()获取登录用户时返回空对象{}。
相关代码与配置
登录获取Token的代码
$user = User::select('id_user', DB::raw('AES_DECRYPT(id_user, "nur") as username')) ->where('id_user', DB::raw('AES_ENCRYPT("' . $credentials['username'] . '", "...")')) ->where('password', DB::raw('AES_ENCRYPT("' . $credentials['password'] . '", "...")')) ->first(); if (!$user) { return response()->json(['error' => 'Unauthorized'], 401); } $token = auth()->login($user); if (!$token) { auth()->setUser($user); return response()->json(['error' => 'Unauthorized'], 401); } return $this->respondWithToken($token);
获取用户信息的接口代码
public function me( ) { return response()->json(auth()->user()); }
返回结果:
{}
路由配置
Route::group(['middleware' => 'api', 'prefix' => 'auth'], function ($router) { Route::post('login', [AuthController::class, 'login']); Route::post('logout', [AuthController::class, 'logout']); Route::post('refresh', [AuthController::class, 'refresh']); Route::post('me', [AuthController::class, 'me']); });
config/auth.php配置
'defaults' => [ 'guard' => 'api', 'passwords' => 'users', ], 'guards' => [ // 'web' => [ // 'driver' => 'session', // 'provider' => 'users', // ], 'api' => [ 'driver' => 'jwt', 'provider' => 'users', ], ], 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], // 'users' => [ // 'driver' => 'database', // 'table' => 'users', // ], ],
测试流程:使用Postman先登录获取token,立即调用me接口,返回空对象。
解决方法
1. 指定User模型的主键
JWT默认使用id作为用户主键,你的表中用的是id_user,需要在User模型中明确配置:
class User extends Model { protected $primaryKey = 'id_user'; // 其他模型代码 }
2. 确保查询返回完整用户实例
当前登录查询仅选择了id_user和username,JWT解析用户时需要完整的模型数据。修改查询,返回完整用户记录:
$user = User::where('id_user', DB::raw('AES_ENCRYPT("' . $credentials['username'] . '", "...")')) ->where('password', DB::raw('AES_ENCRYPT("' . $credentials['password'] . '", "...")')) ->first();
3. 验证Token的传递方式
调用me接口时,必须在请求头中携带Token,格式为Authorization: Bearer {你的Token}。在Postman的Headers中添加该键值对,或在Authorization选项卡选择Bearer Token并填入token。
4. 明确指定JWT Guard
在代码中明确使用api guard,避免默认guard冲突:
// 登录时生成Token $token = auth('api')->login($user); // 获取用户信息时 return response()->json(auth('api')->user());
5. 让User模型实现JWTSubject接口
按照JWT扩展要求,User模型需要实现Tymon\JWTAuth\Contracts\JWTSubject接口,并实现两个方法:
use Tymon\JWTAuth\Contracts\JWTSubject; class User extends Model implements JWTSubject { protected $primaryKey = 'id_user'; // 返回用户主键作为JWT标识 public function getJWTIdentifier() { return $this->getKey(); } // 返回自定义JWT声明(可留空) public function getJWTCustomClaims() { return []; } // 其他模型代码 }
内容的提问来源于stack exchange,提问作者HALIM
相关产品推荐
相关产品推荐

