Laravel 9中使用tymon/jwt-auth用户名登录提示‘Invalid Credentials’问题
登录接口返回"invalid credentials"问题排查与解决
在Postman中测试登录功能时,使用
username和password字段始终收到invalid credentials错误提示。已尝试修改$credentials变量定义,也搜索过相关解决方案但无效。未修改过tymon/jwt-auth的原始文件(如将邮箱改为用户名的操作),使用的JWT版本为tymon/jwt-auth:"dev-develop"。
相关代码
UserController.php
public function login(Request $request) { // 已将变量定义从$request->only('email', 'password')改为$request->only('username', 'password') $credentials = $request->only('username', 'password'); // 下面的写法结果一致 // $credentials = ['username' => $request->input('username'), 'password' => $request->input('password')]; try { if(! $token = JWTAuth::attempt($credentials)) { // 一直触发这个错误 return response()->json(['error' => 'invalid credentials'], 400); } } catch (JWTException $e) { return response()->json(['error' => 'could not create token'], 500); } return $this->createNewToken($token); }
User.php 模型
class User extends Model { use HasFactory; protected $table='users'; protected $primaryKey='id_user'; public $timestamps=false; /** * fillable * * @var array */ protected $fillable = [ 'nama_user', 'role', 'username', 'password' ]; /** * 序列化时需要隐藏的属性 * * @var array<int, string> */ protected $hidden = [ 'password', 'remember_token', ]; public function getJWTIdentifier() { return $this->getKey(); } public function getJWTCustomClaims() { return []; } }
排查与解决步骤
指定JWT登录标识字段
tymon/jwt-auth默认用email作为登录匹配字段,需在配置文件中修改为username:- 若未发布JWT配置文件,先执行:
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider" - 打开
config/jwt.php,找到'identifier'项,修改为:'identifier' => 'username',
- 若未发布JWT配置文件,先执行:
验证密码哈希存储
确保数据库中用户密码是通过Hash::make()生成的哈希值,而非明文。可在User模型中添加自动哈希逻辑:use Illuminate\Support\Facades\Hash; public function setPasswordAttribute($value) { $this->attributes['password'] = Hash::make($value); }手动调试凭证有效性
在login方法中临时加入调试代码,定位问题根源:// 在$credentials定义后添加 $user = User::where('username', $credentials['username'])->first(); if ($user) { dd(Hash::check($credentials['password'], $user->password)); // 查看密码验证是否通过 } else { dd('用户名不存在'); }检查Postman请求参数
确认请求的Content-Type为application/json,且请求体中的username、password字段名与代码完全一致,无拼写错误或多余空格。确认模型实现JWTSubject接口
确保User模型正确引入并实现JWTSubject接口:use Tymon\JWTAuth\Contracts\JWTSubject; class User extends Model implements JWTSubject { // 现有代码保持不变 }
内容的提问来源于stack exchange,提问作者Cicellion
相关产品推荐
相关产品推荐

