Laravel Passport部署后如何避免强制用户重新登录?
解决Laravel Passport部署后密钥丢失导致用户重新登录的问题
核心原因
部署过程中storage/oauth-private.key和storage/oauth-public.key这两个Passport核心密钥文件被覆盖或删除,导致旧的Bearer令牌无法被验证,只能重新执行passport:install生成新密钥,但这会使所有现有令牌失效。
解决方案
1. 持久化Passport密钥文件
- 首次部署完成后,执行
passport:install生成密钥,随后将storage/oauth-private.key和storage/oauth-public.key复制到EC2实例上独立于部署包的持久化目录(比如/var/laravel-passport-keys)。 - 修改Laravel配置文件
config/auth.php,指定Passport使用该持久化目录的密钥:'passport' => [ 'private_key' => env('PASSPORT_PRIVATE_KEY', '/var/laravel-passport-keys/oauth-private.key'), 'public_key' => env('PASSPORT_PUBLIC_KEY', '/var/laravel-passport-keys/oauth-public.key'), ], - 在部署脚本中添加逻辑:每次部署前,将持久化目录的密钥文件复制回项目
storage目录,或直接让配置指向持久化路径(需确保Web服务器用户拥有该目录的读取权限)。
2. 使用环境变量存储密钥内容
- 复制已生成的密钥内容:执行
cat storage/oauth-private.key获取私钥内容,存入环境变量PASSPORT_PRIVATE_KEY_CONTENT;执行cat storage/oauth-public.key获取公钥内容,存入环境变量PASSPORT_PUBLIC_KEY_CONTENT。 - 修改
config/auth.php配置,直接读取环境变量中的密钥字符串:
Laravel Passport支持直接传入密钥字符串,无需依赖文件路径,只要环境变量保持不变,部署后密钥就不会失效。'passport' => [ 'private_key' => env('PASSPORT_PRIVATE_KEY_CONTENT'), 'public_key' => env('PASSPORT_PUBLIC_KEY_CONTENT'), ],
3. 优化部署流程避免覆盖密钥
- 若用Git部署,将
storage/oauth-private.key和storage/oauth-public.key加入.gitignore,防止仓库文件覆盖本地密钥。 - 若用CI/CD工具(如GitHub Actions、GitLab CI),在部署步骤中添加跳过覆盖这两个文件的逻辑,或先备份再恢复。
注意事项
- 确保密钥文件权限正确:Web服务器用户(如
www-data、apache)需拥有密钥文件的读取权限,避免权限异常。 - 密钥属于敏感信息,禁止提交到代码仓库,使用AWS Secrets Manager管理密钥比直接存储在EC2环境变量中更安全。
内容的提问来源于stack exchange,提问作者Laravelbeginner99
相关产品推荐
相关产品推荐

