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

如何让Laravel的GET /account接口响应中返回用户API Token

问题背景

开发用户系统时,创建新账号接口会生成对应的API Token并返回给用户,现在需要实现GET /account查询自身账号信息接口也返回API Token,目前无法实现该需求。
相关截图:
示例截图1
示例截图2
现有代码如下:

控制器文件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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:45:04