Passport 报错主因是 MySQL 版本低于 5.7.8 不支持 JSON 字段,需升级或改用 Socialite;Laravel 9+ 废弃 createFreshApiToken,Laravel 10 需用 passport guard 并确保 Authorization 头正确;token client_id 无效需重跑 passport:install;SPA 场景须统一认证方式并配置 CORS credentials。
composer
require laravel/passport 后 migrate 报错
Passport 的数据库迁移依赖 MySQL 5.7.8+ 或 MariaDB 10.2.7+,低版本不支持 JSON 字段类型。你执行
时看到这个错误,大概率是 MySQL 版本太老。
实操建议:
先运行
确认版本;若低于 5.7.8,别硬升 Passport,改用
做第三方登录更稳妥
若环境可控,升级 MySQL 后,删掉已失败的迁移记录(
可能不生效,直接清空
表中失败项)
Passport 的
中间件在 Laravel 9+ 已废弃,别照着旧文档配
Laravel 10 中 use TokenGuard 但
返回 null
Passport 默认用
guard,不是
或
。你没切对 guard,Auth 就找不到用户。
实操建议:
检查
的
—— 这里必须是
,不是
API 请求头必须带
,漏空格、多空行、用单引号包 token 都会导致解析失败
Token 过期后不会自动刷新,
和
要在
里显式调用
Passport::personalAccessClientId 配置无效,
生成的 token 总是
这是 Laravel 8+ 的坑:Passport 不再读取
里的
,而是强制从数据库查
表中标记为
的那条记录。
Composer 2.9.6
Composer 2.9.6 是 PHP 生态中高效、稳定的依赖管理工具。此版本在性能与兼容性上进一步优化,改进了依赖解析算法,提升大型项目中的安装与更新速度。它支持并行下载任务,显著减少等待时间,并增强了与私有仓库及镜像源的交互稳定性。同时修复了多项命令行交互与内存使用相关的缺陷,确保在复杂依赖关系下依然可靠运行。无论是新项目初始化还是现有系统维护,Composer 2.9.6 都能为开发者提供流畅、精准的依赖管理体验。
下载
实操建议:
别改 .env,运行
重新生成 client,它会自动设好标记
如果已有 client,手动执行 SQL:
(X 是你的 personal client ID)
在 Laravel 10.30+ 默认开启,若你用自定义 ID 映射,记得关掉,否则
会是 hash 值而非数字
前端发请求拿到
,但 Postman 能通
常见于 SPA 场景:Vue/React 发请求时没带 Cookie,或没开
,导致 session 无法复用,Passport 回退到 token 解析,而你又没传 Bearer。
实操建议:
确认是否混用了两种认证方式——Web 登录态(session)和 API token(Bearer),它们互不兼容,别指望一个请求同时走两边
如果是 SPA + Laravel API 模式,别用
中间件,统一走
,前端所有请求加
头
CORS 配置里
必须为 true,且
不能写
,得填具体域名
Passport 的难点不在装,而在“什么时候该用它”。比如内部微服务通信、纯 API 场景才需要 OAuth2 授权码流;管理后台登录、小程序静默登录,用 Sanctum 更轻、更不容易配错。
SQLSTATE[42000]: Syntax error or access violationphp artisan migratemysql --versionlaravel/socialitephp artisan migrate:rollback --step=1migrationscreateFreshApiTokenAuth::user()passportwebapiconfig/auth.php'defaults' => ['guard' => 'api']passportapiAuthorization: Bearer {token}Passport::tokensExpireIn()Passport::refreshTokensExpireIn()AuthServiceProvider@bootcreateToken()client_id=1.envPASSPORT_PERSONAL_ACCESS_CLIENT_IDoauth_clientspersonal_access_client = 1php artisan passport:install --forceUPDATE oauth_clients SET personal_access_client = 1 WHERE id = XPassport::hashIds(false)token->client->id401 UnauthenticatedwithCredentials: trueauth:webauth:passportAuthorizationsupports_credentialsallowed_origins*