FastAPI 登录接口突然报错:cryptography 缺失与 MySQL 认证机制踩坑实录
背景
项目的用户登录API(FastAPI + aiomysql)一直稳定运行,今天突然发现用户无法登录,接口报500错误,但验证码接口依然正常。排查日志发现如下异常:
RuntimeError: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods
现象与初步分析
- 验证码接口正常,说明API主流程和依赖大体无误,数据库连接相关接口异常。
- 报错指向 aiomysql/pymysql 认证阶段,提示缺少 cryptography 包。
- API代码近期无改动,但昨晚对 MySQL 数据库做过操作。
详细排查过程
1. 复现与日志定位
- 访问
/user/login报 500 错误,日志显示 cryptography 缺失。 - 访问
/user/captcha正常,说明 FastAPI 路由和大部分依赖无异常。
2. 检查 MySQL 用户认证方式
进入 MySQL,执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'user';
结果:
| user | host | plugin |
|---|---|---|
| user | % | caching_sha2_password |
说明当前 API 用的数据库用户采用 caching_sha2_password 认证方式。
3. 尝试切换为 mysql_native_password
执行:
ALTER USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
报错:
ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded
进一步查询 MySQL 版本为 8.4.4,发现 8.4.x 已彻底移除 mysql_native_password 插件(官方安全策略升级),无法再切换认证方式。
4. 检查 Python 依赖
requirements.txt已未包含cryptography,且实际运行环境中缺失。- 尝试激活虚拟环境
ai_env,发现目录不存在或路径不对。 - 最终确认 API 实际运行在本地虚拟环境
ai_env,但该环境未正确安装依赖或被破坏。
5. 问题根因推测
- MySQL 8.4.x 只支持 caching_sha2_password/sha256_password,必须依赖 cryptography 包。
- 昨晚对 MySQL 做过操作,可能重置了用户认证方式或触发了依赖校验,导致原本可用的认证方式失效。
- 虚拟环境依赖未持久化或被清理,cryptography 包丢失。
解决方法
-
激活虚拟环境(假设在项目根目录):
source ai_env/bin/activate -
安装 cryptography 依赖:
pip install cryptography或确保 requirements.txt 中有 cryptography 后:
pip install -r requirements.txt -
重启主程序/服务,验证登录接口恢复正常。
总结与经验
- MySQL 8.0.33+ 逐步弃用
mysql_native_password,8.4.x 已彻底移除,务必关注官方变更日志。 - caching_sha2_password/sha256_password 认证方式在 Python 侧必须有 cryptography 包支持。
- 生产环境建议所有依赖写入 requirements.txt,并定期检查虚拟环境依赖完整性。
- 容器/虚拟环境重建后,务必重新安装所有依赖,避免因依赖丢失导致线上故障。
- 数据库用户认证方式变更、密码重置等操作,可能影响现有服务的认证链路。
最终解决方案:
增加依赖包 cryptography 并安装,重启主程序后问题解决。问题产生的原因推测为昨晚对 MySQL 数据库的操作导致认证方式校验失效,进而暴露出 Python 依赖缺失的问题。
如遇类似问题,优先检查数据库认证方式与 Python 依赖链,避免踩坑!
FastAPI 登录接口突然报错:cryptography 缺失与 MySQL 认证机制踩坑实录
https://sisuad.cn/archives/630aa71c-2a1e-4476-8119-a6649ec25a37