使用Python pymongo连接MongoDB报Authentication failed错误如何解决
MongoDB 18号认证失败错误的诱因、排查与修复方案
核心诱因
code: 18, codeName: AuthenticationFailed是MongoDB服务端直接返回的认证拒绝响应,和Python语法本身无关,常见触发原因如下:
- 账号密码不匹配:连接串中填写的
root账号对应密码和MongoDB中存储的实际密码不一致,是占比最高的故障原因 - 认证库配置错误:连接串中指定
authSource=admin,但root账号实际并非创建在admin库下,服务端找不到对应用户自然认证失败 - 连接目标错误:连接串中主机名写的是
mongo,如果该域名解析到的不是预期的MongoDB实例(比如连到其他测试实例、别人部署的临时实例),账号密码必然不匹配 - 账号状态异常:
root账号被删除、禁用,或者没有被授予目标库的访问权限 - 环境特殊问题:如果是Docker部署的MongoDB,容器重建且未配置数据持久化时,之前设置的账号密码会全部失效;pymongo版本过低不匹配MongoDB 4.0+的SCRAM-SHA-256认证机制时,也可能抛出该错误
排查步骤
按从易到难顺序排查,不用上来就改代码:
- 绕过代码直接验证账号有效性:在可以访问MongoDB的机器上用官方客户端执行连接命令
如果这一步都连不上,问题和Python代码完全无关,直接查账号、认证库、连接目标的问题。# 用你连接串里的账号、密码、认证库参数直连 mongo -u root -p password --authenticationDatabase admin --host mongo --port 27017 - 校验认证库是否正确:如果上一步连不上,把
--authenticationDatabase参数的值换成database_sample再试,能连通就说明之前的authSource配置错了。 - 确认连接的实例正确:先不带账号密码连
mongo:27017,执行show dbs看返回的库列表是不是你预期的,排除连错实例的问题。 - 版本校验:如果前面都没问题,执行
pymongo.version看pymongo版本,MongoDB 4.0以上实例要求pymongo版本至少3.10以上,版本过低先升级。
修复方案
对应排查到的原因直接调整即可:
- 账号密码错误:登录MongoDB后在账号所属库下执行密码重置命令,更新为正确密码
- 认证库配置错误:修改连接串里的
authSource参数为账号实际所属的库,比如账号建在database_sample下就把参数改成authSource=database_sample - 连错实例:把连接串里的
mongo主机名替换为目标MongoDB实例的正确IP或域名 - 环境问题:Docker部署的场景检查数据卷挂载配置,重建实例后重新创建账号;pymongo版本过低执行
pip install --upgrade pymongo升级即可 - 额外提示:你的代码里数据库名取的是
database_sample,集合名取的是database虽然语法不报错,但命名辨识度低,后续容易出现操作错对象的问题,建议调整。
内容的提问来源于stack exchange,提问作者Montana
相关产品推荐
相关产品推荐

