Laravel 5.8 Passport在AuthServiceProvider报错及客户端ID创建咨询
问题分析与解决方案
报错原因
结合你的代码和Laravel 5.8的Passport特性,报错主要来自三个核心点:
- 缺失
remember_token字段:你的User模型继承了Authenticatabletrait,这个 trait 依赖remember_token字段处理会话相关逻辑,Passport初始化路由和token配置时会调用该 trait 的方法,缺失此字段会触发「数据库字段不存在」的错误。 - API Guard驱动未切换为Passport:你仅修改了认证提供者,但
config/auth.php中apiguard的驱动仍为默认的token,未切换为passport,导致Passport的路由无法绑定正确的认证逻辑。 - 未执行Passport专属迁移:Passport需要
oauth_clients、oauth_access_tokens等专属表存储令牌和客户端信息,若未执行迁移,这些表不存在会直接导致路由初始化失败。
解决步骤
1. 恢复remember_token字段
即使你不需要「记住我」功能,Authenticatable trait 仍依赖这个字段。如果已经运行过用户表迁移,创建新迁移来添加该字段:
php artisan make:migration add_remember_token_to_users_table
在生成的迁移文件中写入:
public function up() { Schema::table('users', function (Blueprint $table) { $table->rememberToken(); }); } public function down() { Schema::table('users', function (Blueprint $table) { $table->dropColumn('remember_token'); }); }
执行迁移:
php artisan migrate
2. 配置API Guard为Passport
修改config/auth.php的guards部分,将api的驱动改为passport:
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'passport', // 替换为passport驱动 'provider' => 'users', ], ],
3. 完成Passport的安装与迁移
确保Passport的迁移文件已发布并执行:
# 发布Passport迁移文件(首次安装需执行) php artisan vendor:publish --tag=passport-migrations # 执行所有数据库迁移 php artisan migrate # 安装Passport(生成加密密钥与默认客户端) php artisan passport:install
4. 启用Passport配置并清除缓存
取消AuthServiceProvider中那三行代码的注释,然后清除配置和路由缓存:
php artisan config:clear php artisan route:clear
创建客户端ID的方法
有两种常用方式生成Passport客户端:
方式1:使用Artisan命令(推荐)
执行以下命令,按照提示完成配置:
php artisan passport:client
- 选择
Password Grant Client:适合移动端或第三方客户端通过用户名密码获取令牌 - 输入客户端名称(如「My App API Client」)
- 回调URL可留空(密码授权模式不需要)
- 完成后会输出客户端ID和密钥,务必保存这两个值。
方式2:代码动态创建
如果需要在业务逻辑中动态生成客户端,可使用Passport的Client模型:
use Laravel\Passport\Client; use Illuminate\Support\Str; $client = Client::create([ 'name' => 'Dynamic API Client', 'secret' => Str::random(40), 'redirect' => 'http://your-app-callback-url.com', // 根据业务需求填写 'personal_access_client' => false, 'password_client' => true, // 标记为密码授权客户端 'revoked' => false, ]); // 获取客户端ID和密钥 $clientId = $client->id; $clientSecret = $client->secret;
内容的提问来源于stack exchange,提问作者Alaksandar Jesus Gene
相关产品推荐
相关产品推荐

