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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 14:57:01