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

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_api Guard:
    if (!$token = JWTAuth::guard('admin_api')->attempt($credentials)) {
        // ...
    }
    
  • 检查config/auth.php中admin_api Guard的hash设置为false是否合理:如果Admin模型的密码是哈希存储的,需将hash改为true。

内容的提问来源于stack exchange,提问作者enamul haque

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:30:42