GitLab CI/CD中Laravel 11项目‘The payload is invalid’错误求助
Laravel 11 GitLab CI/CD测试中"The payload is invalid"加密错误排查
问题背景
在Laravel 11 + React TypeScript + Inertia项目的GitLab CI/CD测试任务中,执行PHPUnit测试时触发Illuminate\Contracts\Encryption\DecryptException: The payload is invalid错误,堆栈指向Fortify双因素认证相关代码,已确认CI/CD变量中设置了APP_KEY但问题依旧。
排查与解决步骤
1. 验证APP_KEY的正确性与注入情况
- 确保GitLab CI变量中的APP_KEY是完整的
base64:...格式字符串,无多余空格、换行或截断,很多人复制KEY时容易漏掉base64:前缀,直接导致解密失败。 - 在CI的
before_script中添加输出验证:
查看CI日志输出的KEY是否与本地测试环境的有效APP_KEY完全一致,确认变量是否正确注入。echo "当前APP_KEY值:$APP_KEY"
2. 修正环境变量的写入方式
当前通过echo追加环境变量的方式,如果.env.example中已存在APP_KEY或APP_ENV配置,会导致文件中出现重复行,Laravel会优先读取第一行,从而使用错误的KEY。建议改用sed命令直接替换对应配置:
# 替换APP_ENV为testing sed -i 's/^APP_ENV=.*/APP_ENV=testing/' .env # 替换APP_KEY为CI变量值 sed -i 's/^APP_KEY=.*/APP_KEY='$APP_KEY'/' .env
3. 确保配置缓存完全清除
在设置完环境变量后,执行完整的缓存清理命令,确保Laravel读取最新的.env配置:
php artisan optimize:clear
该命令会清除配置、路由、视图、编译文件等所有缓存,避免旧配置残留。
4. 检查测试用例中的数据生成逻辑
错误堆栈指向双因素认证的recovery codes再生测试,需确保测试用例中使用的用户数据是在CI环境中实时生成的:
- 避免在测试中使用预先生成的、带有加密字段(如
two_factor_recovery_codes)的用户数据(比如从本地数据库导出的种子数据),这类数据是用本地APP_KEY加密的,在CI环境无法解密。 - 在测试的
setUp方法中创建新用户,并在测试流程中完成双因素认证的开启操作,确保recovery codes是用CI环境的APP_KEY加密生成的。
5. 验证PHP加密扩展是否存在
Laravel加密依赖OpenSSL扩展,确认CI使用的php:latest镜像已安装该扩展:
# 在before_script中添加验证命令 php -m | grep openssl
如果输出为空,需安装扩展:
apt-get update && apt-get install -y php-openssl
6. 确认数据库配置一致性
当前CI配置中同时启用了MySQL服务并创建了SQLite文件,需确保.env中的数据库配置与实际使用的数据库一致:
- 如果使用SQLite,添加以下配置到
.env:echo "DB_CONNECTION=sqlite" >> .env echo "DB_DATABASE=/builds/group-kse/indupendo/database/database.sqlite" >> .env - 如果使用MySQL,需补充用户名、密码、主机配置:
避免因数据库连接异常导致数据写入错误,间接引发加密问题。echo "DB_CONNECTION=mysql" >> .env echo "DB_HOST=mysql" >> .env echo "DB_DATABASE=test_db" >> .env echo "DB_USERNAME=root" >> .env echo "DB_PASSWORD=" >> .env
内容的提问来源于stack exchange,提问作者Klem Lloyd Mwenya
相关产品推荐
相关产品推荐

