Laravel Passport 生产环境CD部署后已登录用户被强制登出如何解决?
问题根因
该问题和你测试过的file、redis会话驱动无关,Passport API鉴权逻辑不依赖会话存储,核心触发原因基本为以下三类:
- CD部署流程中执行了
php artisan passport:install命令,每次生成新的公私钥,导致之前签发的令牌验签全部失败 - 生产环境Passport公私钥未固化,每次部署后新实例无法读取到上一版本使用的密钥文件
- 部署流程意外重置了
APP_KEY或清空了存储有效令牌的持久化介质(数据库、Redis等)
解决方案
1. 固化Passport公私钥,移除部署流程中的密钥生成逻辑
这是最常见的问题触发点,修复方式如下:
- 首次部署时仅生成一次Passport公私钥,默认生成的密钥文件为
storage/oauth-private.key和storage/oauth-public.key,不要将这两个文件提交到代码仓库,存入生产环境私密配置管理系统即可 - 删掉CD部署脚本中的
php artisan passport:install执行逻辑,部署时直接从配置管理系统将预生成的固定密钥写入到项目storage/对应路径 - 不想维护实体密钥文件的话,可直接通过.env环境变量注入密钥,Passport 9原生支持该配置:
PASSPORT_PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY----- 替换为你自己生成的私钥完整内容 -----END RSA PRIVATE KEY-----" PASSPORT_PUBLIC_KEY="-----BEGIN PUBLIC KEY----- 替换为你自己生成的公钥完整内容 -----END PUBLIC KEY-----" - 多实例部署场景下必须保证所有实例使用同一套公私钥,避免跨实例验签失败
2. 固化生产环境APP_KEY
Laravel的APP_KEY用于加密包括Passport敏感字段在内的所有核心加密数据,若CD脚本中执行了php artisan key:generate会重置该值,直接导致已有令牌解析失败。需要移除部署流程中的key:generate执行逻辑,固定生产环境APP_KEY值。
3. 校验令牌存储的持久化逻辑
- 如果使用Passport默认的数据库存储令牌方案,确保部署流程不会清空
oauth_access_tokens、oauth_refresh_tokens等关联表数据 - 如果使用自定义令牌存储方案,确保存储介质和部署流程完全隔离,不会因部署触发批量数据清理
内容的提问来源于stack exchange,提问作者Faramarz Qoshchi
相关产品推荐
相关产品推荐

