Laravel使用JWT登录返回Invalid credentials问题排查求助
解决Tymon/JWT-Auth登录返回"Invalid credentials"问题
针对你配置Tymon/JWT-Auth后登录接口返回"Invalid credentials"的问题,按以下步骤逐一排查:
1. 检查密码哈希是否正确
User模型继承Authenticatable,默认要求密码以哈希形式存储。如果创建用户时直接存入明文密码,attempt方法会验证失败:
- 创建用户时必须使用
Hash::make()处理密码:$user = User::create([ 'username' => 'test', 'password' => Hash::make('your-password'), ]); - 临时调试验证:在
login方法中添加代码,确认密码哈希匹配:$user = User::where('username', $request->username)->first(); if ($user) { dd(Hash::check($request->password, $user->password)); // 返回true则密码正确,false则密码未哈希 }
2. 明确指定认证字段(username替代默认email)
JWTAuth::attempt()默认验证email和password字段,但你使用的是username,需手动指定认证字段:
修改UserController的login方法:
public function login(Request $request) { $credentials = $request->only('username', 'password'); // 明确指定username作为认证字段 if (!$token = JWTAuth::attempt(['username' => $credentials['username'], 'password' => $credentials['password']])) { return response()->json(['error' => 'Invalid credentials'], 401); } return response()->json(compact('token')); }
或者在User模型中重写认证字段方法:
public function getAuthIdentifierName() { return 'username'; }
3. 验证JWT核心配置
- 确保已生成JWT密钥:运行
php artisan jwt:secret,检查.env文件是否存在JWT_SECRET配置项。 - 确认依赖兼容:根据Laravel版本安装对应版本的Tymon/JWT-Auth,例如Laravel 10需安装
tymon/jwt-auth:^2.1,同时确保lcobucci/jwt依赖已安装(运行composer require lcobucci/jwt:^4.0)。
4. 调试登录逻辑定位问题
在login方法中拆分验证步骤,精准定位失败原因:
public function login(Request $request) { $username = $request->input('username'); $password = $request->input('password'); // 1. 检查用户是否存在 $user = User::where('username', $username)->first(); if (!$user) { return response()->json(['error' => 'User not found'], 404); } // 2. 检查密码是否匹配 if (!Hash::check($password, $user->password)) { return response()->json(['error' => 'Password incorrect'], 401); } // 3. 手动生成Token测试 try { $token = JWTAuth::fromUser($user); return response()->json(compact('token')); } catch (\Exception $e) { return response()->json(['error' => 'Failed to generate token: ' . $e->getMessage()], 500); } }
5. 确认Guard配置正确性
- 对于Admin登录,需在
AdminController的login方法中指定admin_apiGuard:if (!$token = JWTAuth::guard('admin_api')->attempt($credentials)) { // ... } - 检查
config/auth.php中admin_apiGuard的hash设置为false是否合理:如果Admin模型的密码是哈希存储的,需将hash改为true。
内容的提问来源于stack exchange,提问作者enamul haque
相关产品推荐
相关产品推荐

