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

Laravel Passport createToken不返回Bearer认证可用令牌字符串问题

问题原因
  • 核心是createToken()的取值逻辑和你实际使用的认证驱动不匹配,结合你的返回结构,常见两种触发场景:
    1. 项目实际安装的是Laravel Sanctum而非Passport,却沿用了Passport的->accessToken取值方式:Sanctum的createToken()返回的是Laravel\Sanctum\NewAccessToken实例,明文令牌存储在plainTextToken属性上,不存在accessToken属性,取值失败后接口直接返回了令牌实例序列化后的元数据。
    2. 若确实使用Laravel Passport,则是User模型引入了错误的HasApiTokens trait:引入了Sanctum的同名trait而非Passport提供的Laravel\Passport\HasApiTokens,导致createToken()返回的不是Passport的Token实例,无法读取accessToken。
  • 额外代码问题:你把令牌存在了$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做认证

  1. 首先修正User模型的trait引入:
// 注释掉错误的Sanctum引入
// use Laravel\Sanctum\HasApiTokens;
// 替换为Passport提供的HasApiTokens
use Laravel\Passport\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;
    // 其余模型逻辑保持不变
}
  1. 调整登录接口返回结构,去掉多余嵌套:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 13:03:00