php artisan passport:install 必须在完成数据库迁移、确保Laravel与Passport版本匹配、且users表存在后执行,否则会因表缺失、字段不全或权限问题导致失败;成功后输出两组client_id/client_secret,第二组专用于密码授权模式。

php artisan passport:install 是 Laravel Passport 的核心初始化命令,它不单独存在,必须在正确前置条件满足后才能成功执行。直接运行却报错,90% 是因为漏了关键步骤。
✅ 执行前必须完成的三件事
数据库已连通,且
users表存在
Passport 会在users表中添加tokenable_type和tokenable_id字段(通过迁移自动处理),所以用户表不能是空的或缺失的。已成功运行
php artisan migrate
Passport 自带的迁移文件(如create_oauth_clients_table、create_oauth_access_tokens_table等)必须先入库。否则passport:install会因找不到oauth_clients表而失败,报错类似:SQLSTATE[42S02]: Base table or view not found: 1146 Table 'xxx.oauth_clients' doesn't exist-
Laravel 版本与 Passport 版本严格匹配
例如:- Laravel 10 → 必须用
laravel/passport:^11.0(不是^10.0) - Laravel 9 → 对应
^10.0
运行php artisan --version确认真实版本,再查 Passport 官方兼容表,安装时带上精确版本约束:composer require laravel/passport:^11.0
- Laravel 10 → 必须用
✅ 正确执行顺序(不可颠倒)
# 1. 安装包(带版本号) composer require laravel/passport:^11.0 # 2. 执行所有迁移(含 Passport 自带的) php artisan migrate # 3. 初始化密钥和默认客户端 php artisan passport:install
执行成功后,终端会输出两组 client_id 和 client_secret:
- 第一组是 Personal Access Client(用于
createToken()测试) - 第二组是 Password Grant Client(用于
/oauth/token密码模式换 token)
⚠️ 这两个 client_secret 务必保存好,尤其是 Password Grant 的 —— 后续前端或 App 调用
/oauth/token时必须传入。
❌ 常见失败场景与应对
-
报错
Call to undefined method createPersonalAccessClient()
→ 说明oauth_clients表存在但缺少personal_access_client字段(Laravel 9+ 强制要求)。
解决:回滚迁移再重跑php artisan migrate:rollback --step=1 php artisan migrate php artisan passport:install
-
报错
file_get_contents(): failed to open stream
→storage/oauth-private.key或oauth-public.key权限不足,Web 服务器用户(如www-data)无读取权限。
解决:chmod 644 storage/oauth-*.key chown www-data:www-data storage/oauth-*.key
提示
Table 'oauth_clients' already exists
→ 你可能手动跑过迁移,又执行了passport:install(它内部也会尝试建表)。
解决:删掉database/migrations/*oauth*.php文件,确认表已存在,直接运行passport:install即可。
✅ 补充:如果只想生成密钥、跳过客户端创建
加 --force 参数可强制覆盖已有密钥,但不会重建客户端:
php artisan passport:install --force
如需重新创建 Password Grant 客户端(比如丢了 secret),可用:
php artisan passport:client --password
不复杂但容易忽略。


















