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

Laravel Passport返回JSON时access token未正常显示问题

问题原因

该问题由两个错误共同导致:

  • 令牌属性取值错误:你的User模型里引入的是Laravel Sanctum默认提供的HasApiTokens trait,而非Passport对应的trait。这种情况下createToken()返回的实例中,->accessToken指向的是存在数据库里的令牌元信息模型(就是你响应里看到的带id、name、abilities、关联用户id的那个对象),不是可用于接口鉴权的明文凭据字符串,可直接使用的明文凭据存在plainTextToken属性下。
  • 响应数组结构写错:最后返回JSON时你写的[$data, "message" => "data has been retrieved"]是错误结构,PHP会把整个$data数组当成索引为0的元素塞入返回值,会导致返回格式异常。
修复方案

根据你实际使用的认证包选对应方案即可:

方案1:确认要用Laravel Passport做认证

  1. 先修改User模型的头部引用,替换掉错误的trait:
// 删除默认引入的Sanctum trait
// use Laravel\Sanctum\HasApiTokens;
// 引入Passport提供的trait
use Laravel\Passport\HasApiTokens;
  1. 修正控制器里的返回逻辑,调整数组结构:
$user = $request->user();
// Passport创建的令牌直接取accessToken就是明文
$accessToken = $user->createToken('authToken')->accessToken;

return response()->json([
    'user' => $user,
    'access_token' => $accessToken,
    'message' => 'data has been retrieved'
]);

方案2:实际用的是Laravel默认预装的Laravel Sanctum

不需要替换trait,直接取明文令牌属性、修正返回结构就行:

$user = $request->user();
$tokenInstance = $user->createToken('authToken');

return response()->json([
    'user' => $user,
    // Sanctum的明文令牌存在plainTextToken属性下
    'access_token' => $tokenInstance->plainTextToken,
    'message' => 'data has been retrieved'
]);

注意:不管用Passport还是Sanctum,明文access_token只会在创建成功的当次返回,后续数据库里只会存储令牌的哈希值,无法再查询到完整明文,必须在创建时就返回给前端保存。

内容的提问来源于stack exchange,提问作者Khaldoun Al Halabi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 10:48:43