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-interactionPersonal 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
相关产品推荐
相关产品推荐

