You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:

    1. 若未发布JWT配置文件,先执行:php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
    2. 打开config/jwt.php,找到'identifier'项,修改为:'identifier' => 'username',
  • 验证密码哈希存储
    确保数据库中用户密码是通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 21:34:57