Laravel Passport返回JSON时access token未正常显示问题
问题原因
该问题由两个错误共同导致:
- 令牌属性取值错误:你的
User模型里引入的是Laravel Sanctum默认提供的HasApiTokenstrait,而非Passport对应的trait。这种情况下createToken()返回的实例中,->accessToken指向的是存在数据库里的令牌元信息模型(就是你响应里看到的带id、name、abilities、关联用户id的那个对象),不是可用于接口鉴权的明文凭据字符串,可直接使用的明文凭据存在plainTextToken属性下。 - 响应数组结构写错:最后返回JSON时你写的
[$data, "message" => "data has been retrieved"]是错误结构,PHP会把整个$data数组当成索引为0的元素塞入返回值,会导致返回格式异常。
修复方案
根据你实际使用的认证包选对应方案即可:
方案1:确认要用Laravel Passport做认证
- 先修改
User模型的头部引用,替换掉错误的trait:
// 删除默认引入的Sanctum trait // use Laravel\Sanctum\HasApiTokens; // 引入Passport提供的trait use Laravel\Passport\HasApiTokens;
- 修正控制器里的返回逻辑,调整数组结构:
$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
相关产品推荐
相关产品推荐

