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

Laravel 10 Passport返回Token对象而非可用字符串问题求助

问题:Laravel Passport返回access_token为对象而非字符串

在Laravel 10中通过API实现OAuth2授权,注册、登录功能正常,但无法获取可用于后续请求的Token字符串。当前返回的data.access_token是对象,而非预期的长字符串形式,返回示例如下:

{
    "success": true,
    "data": {
        "id": 1,
        "name": "Schizo",
        "email": "********@gmail.com",
        "access_token": {
            "name": "DesktopClient",
            "abilities": [
                "*"
            ],
            "expires_at": null,
            "tokenable_id": 1,
            "tokenable_type": "App\\Models\\User",
            "updated_at": "2023-07-08T16:22:30.000000Z",
            "created_at": "2023-07-08T16:22:30.000000Z",
            "id": 2
        }
    },
    "message": "User login successfully."
}

预期获取的Token为长字符串形式。

版本信息

  • PHP 8.1.21
  • Laravel Framework 10.14.1
  • Laravel Passport 11.8.8

配置情况

  • 已执行个人访问客户端创建命令:
    php artisan passport:client --personal --no-interaction
    
    命令输出:
    Personal access client created successfully.
    Client ID: 16
    Client secret: KjpvwyB1XMZTfh8aFZzrSJZrb3di83JZsj6ZvRud
    
  • 数据库oauth_clients和oauth_personal_access_clients表已生成对应记录,且.env配置如下:
    PASSPORT_PERSONAL_ACCESS_CLIENT_ID=16
    PASSPORT_PERSONAL_ACCESS_CLIENT_SECRET=KjpvwyB1XMZTfh8aFZzrSJZrb3di83JZsj6ZvRud
    
  • config/auth.php中API守卫配置为Passport:
    return [
        'guards' => [
            'web' => [
                'driver' => 'session',
                'provider' => 'users',
            ],
            'api' => [
                'driver' => 'passport',
                'provider' => 'users',
                'hash' => true,
            ],
        ],
    ];
    
  • routes/api.php定义路由:
    Route::post('register', [AuthController::class, 'register']);
    Route::post('login', [AuthController::class, 'login']);
    
  • AuthController中通过createToken生成Token并返回,但结果不符合预期。曾尝试在users表添加api_token字段,未解决问题。

解决方案

1. 获取正确的Token字符串

createToken方法返回的是Laravel\Passport\PersonalAccessTokenResult实例,直接返回该实例会序列化为对象,需要调用plainTextToken属性获取纯字符串Token。修改AuthController中的登录/注册逻辑:

// 登录示例
public function login(Request $request)
{
    // 验证逻辑(如邮箱密码校验)...
    $user = User::where('email', $request->email)->first();
    
    $tokenResult = $user->createToken('DesktopClient');

    return response()->json([
        'success' => true,
        'data' => [
            'id' => $user->id,
            'name' => $user->name,
            'email' => $user->email,
            'access_token' => $tokenResult->plainTextToken,
            'token_type' => 'Bearer',
            'expires_at' => $tokenResult->accessToken->expires_at
        ],
        'message' => 'User login successfully.'
    ]);
}

2. 移除多余的api_token字段

Laravel Passport不需要手动在users表添加api_token字段,该字段属于Laravel原生API令牌的旧实现,Passport会通过自身的数据库表管理令牌,因此可以删除该字段。

3. 验证Passport基础配置

如果尚未执行过,运行以下命令生成Passport加密密钥:

php artisan passport:install

确保.env中的个人客户端ID和密钥与oauth_clients表中personal_access_client字段为1的记录完全一致。

内容的提问来源于stack exchange,提问作者Hopex Development

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:09:52