Symfony 5项目部署Heroku后报错:无法基于给定配置生成签名JWT
根因说明
该错误是Heroku环境无法读取JWT加密所需的公私钥文件导致,本地运行正常是因为你的本地环境存在config/jwt/private.pem和config/jwt/public.pem两个密钥文件,而这两个文件通常会被默认加入.gitignore规则,不会随代码提交到Heroku,因此Heroku环境缺少生成JWT所需的核心配置。
推荐解决方案(安全无敏感文件泄露风险)
无需将密钥文件提交到代码仓库,直接把密钥内容写入Heroku环境变量即可:
- 第一步:本地执行命令将密钥转为单行格式,避免换行符识别异常
输出私钥单行内容:awk -v ORS='\\n' '1' config/jwt/private.pem
输出公钥单行内容:awk -v ORS='\\n' '1' config/jwt/public.pem - 第二步:更新Heroku环境变量配置,替换原来的路径类配置
heroku config:set JWT_SECRET_KEY="刚才输出的私钥单行内容" heroku config:set JWT_PUBLIC_KEY="刚才输出的公钥单行内容" heroku config:set JWT_PASSPHRASE=pass - 第三步:修改Symfony的JWT配置文件
config/packages/lexik_jwt_authentication.yaml,适配直接读取环境变量中的密钥内容:lexik_jwt_authentication: secret_key: '%env(resolve:JWT_SECRET_KEY)%' public_key: '%env(resolve:JWT_PUBLIC_KEY)%' pass_phrase: '%env(JWT_PASSPHRASE)%' - 第四步:提交修改后的配置文件,推送到Heroku并重启应用即可生效。
可选解决方案(不推荐,存在敏感文件泄露风险)
如果你一定要保留路径形式的配置,可按如下操作:
- 检查项目
.gitignore文件,删除或注释忽略config/jwt/*.pem的规则 - 执行
git add config/jwt/*.pem -f强制提交密钥文件到代码仓库,推送到Heroku - 执行
heroku run chmod 644 config/jwt/*.pem调整密钥文件权限,避免Heroku进程无权限读取文件
验证方式
部署完成后执行heroku run php bin/console lexik:jwt:generate-token test,如果正常输出token字符串则说明配置生效。
内容的提问来源于stack exchange,提问作者Demi St
相关产品推荐
相关产品推荐

