Laravel 9 集成Passport无法生成有效accessToken问题求助
Laravel 9 Passport 登录返回令牌模型而非accessToken字符串修复方案
问题根因
该问题是User模型引入了错误的HasApiTokens trait导致:Laravel 9默认自带Sanctum认证包,默认引入的Laravel\Sanctum\HasApiTokens调用createToken()返回的是Sanctum的个人访问令牌模型实例,访问->accessToken属性不会返回Passport生成的明文凭据字符串,只会返回模型本身的结构化数据,和你遇到的响应表现完全一致。
修复操作
- 替换User模型的trait引入
打开app/Models/User.php,删除原有Sanctum的trait引用,替换为Passport提供的对应trait:
<?php namespace App\Models; // 移除默认的Sanctum trait引用 // use Laravel\Sanctum\HasApiTokens; // 引入Passport的trait use Laravel\Passport\HasApiTokens; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\Factories\HasFactory; class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; // 其余模型原有代码保持不变 }
- 调整认证守卫配置
打开config/auth.php,将api守卫的驱动修改为passport:
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'passport', // 此处不能为默认的sanctum 'provider' => 'users', ], ],
- 验证修复结果
完成上述修改后重启服务,重新调用登录接口,$user->createToken('Laravel Password Grant Client')->accessToken就会返回可直接用于接口认证的明文令牌字符串,正常响应格式示例:
{ "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6IjMyYzUxOGNjZWJhNjNhNWM3NTk0NTg3ZGUzYzU4YjQwOWYx..." }
- 异常排查(可选)
如果修改后仍无法正常返回令牌,确认已完成Passport基础配置:- 已执行
php artisan passport:install生成接口签名所需的公私钥 - 在
app/Providers/AuthServiceProvider.php的boot()方法中已调用Passport::routes()注册Passport相关认证路由
- 已执行
内容的提问来源于stack exchange,提问作者Sujith Sandeep
相关产品推荐
相关产品推荐

