Laravel Passport createToken不返回Bearer认证可用令牌字符串问题
问题原因
- 核心是
createToken()的取值逻辑和你实际使用的认证驱动不匹配,结合你的返回结构,常见两种触发场景:- 项目实际安装的是Laravel Sanctum而非Passport,却沿用了Passport的
->accessToken取值方式:Sanctum的createToken()返回的是Laravel\Sanctum\NewAccessToken实例,明文令牌存储在plainTextToken属性上,不存在accessToken属性,取值失败后接口直接返回了令牌实例序列化后的元数据。 - 若确实使用Laravel Passport,则是User模型引入了错误的
HasApiTokenstrait:引入了Sanctum的同名trait而非Passport提供的Laravel\Passport\HasApiTokens,导致createToken()返回的不是Passport的Token实例,无法读取accessToken。
- 项目实际安装的是Laravel Sanctum而非Passport,却沿用了Passport的
- 额外代码问题:你把令牌存在了
$success['token']数组中,返回时又把整个$success数组赋值给响应的token字段,多包了一层嵌套,也导致返回结构不符合预期。
解决方案
根据你实际使用的认证组件选择对应方案即可:
场景1:使用Laravel Sanctum做认证
修改createToken的取值属性,同时去掉多余的嵌套结构:
public function login() { if (Auth::attempt(['email' => request('email'), 'password' => request('password')])) { $user = Auth::user(); // 改用plainTextToken获取明文令牌 $token = $user->createToken('appToken')->plainTextToken; return response()->json([ 'success' => true, 'token' => $token, 'user' => $user ]); } else { return response()->json([ 'success' => false, 'message' => 'Invalid Email or Password', ], 401); } }
场景2:确定使用Laravel Passport做认证
- 首先修正User模型的trait引入:
// 注释掉错误的Sanctum引入 // use Laravel\Sanctum\HasApiTokens; // 替换为Passport提供的HasApiTokens use Laravel\Passport\HasApiTokens; class User extends Authenticatable { use HasApiTokens, Notifiable; // 其余模型逻辑保持不变 }
- 调整登录接口返回结构,去掉多余嵌套:
public function login() { if (Auth::attempt(['email' => request('email'), 'password' => request('password')])) { $user = Auth::user(); $token = $user->createToken('appToken')->accessToken; return response()->json([ 'success' => true, 'token' => $token, 'user' => $user ]); } else { return response()->json([ 'success' => false, 'message' => 'Invalid Email or Password', ], 401); } }
修改完成后返回的token字段就是可直接放入Authorization: Bearer {令牌}请求头的明文校验字符串。
内容的提问来源于stack exchange,提问作者Jade
相关产品推荐
相关产品推荐

