如何让Laravel的GET /account接口响应中返回用户API Token
问题背景
开发用户系统时,创建新账号接口会生成对应的API Token并返回给用户,现在需要实现GET /account查询自身账号信息接口也返回API Token,目前无法实现该需求。
相关截图:

现有代码如下:
控制器文件User.php代码
public function index() { $users = User::where('id', auth()->user()->id)->get(); return response([ 'data' => UserResource::collection($users), 'message' => 'Retrieve successfully' ], 200); } // POST public function store(Request $request) { $data = $request->all(); $validator = Validator::make($data, [ 'name' => 'required|max:255|string', 'email' => 'required|email|unique:users,email', 'password' => 'required|string', ]); if ($validator->fails()) { return response(['error' => $validator->errors(), 'Validation Error'], 400); } $users = User::create($data); $token = $users->createToken('accessToken')->plainTextToken; return response([ 'data' => new UserResource($users), 'api_token' => $token, 'message' => 'Created successfully' ], 201); }
路由配置文件api.php代码
Route::group(['prefix' => 'v1' ], function () { // Account Route::post('/account', [UserController::class, 'store']); // Protected route Route::group(['middleware' => ['auth:sanctum']], function () { // Account Route::get('/account', [UserController::class, 'index']); }); });
解决方案
核心原因说明
Laravel Sanctum 生成的明文 API Token 仅在调用 createToken 方法时返回一次,数据库仅存储该 Token 的哈希值,无法逆向解析得到原始明文 Token,因此无法直接从已有的用户查询结果中获取之前创建的明文 Token。
方案1:每次查询账号信息时生成新Token(推荐,适配不同业务场景)
修改 UserController 的 index 方法如下:
public function index() { // 直接获取当前认证用户实例,不需要额外查询集合 $user = auth()->user(); // 可选配置:如果仅允许单端登录,可删除用户之前生成的所有旧Token // $user->tokens()->delete(); // 生成新的明文Token $newToken = $user->createToken('accessToken')->plainTextToken; return response([ 'data' => new UserResource($user), 'api_token' => $newToken, 'message' => 'Retrieve successfully' ], 200); }
说明:如果不删除旧Token,用户可以同时存在多个有效Token,适配多端同时登录的场景;删除旧Token则所有之前的登录凭证都会失效,仅保留当前新生成的Token可用。
方案2:将Token字段整合到UserResource中(适合统一返回格式)
如果希望api_token字段统一封装在data结构内返回,可以修改UserResource文件:
// app/Http/Resources/UserResource.php public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name, 'email' => $this->email, // 其他原有返回字段 'api_token' => $this->when($request->isMethod('get'), function () { return $this->createToken('accessToken')->plainTextToken; }) ]; }
修改后控制器不需要额外处理api_token字段,GET请求会自动在返回的资源数据中携带该字段。
内容的提问来源于stack exchange,提问作者Bình Nguyễn
相关产品推荐
相关产品推荐

