必须显式指定authSource参数,其值为用户凭据所在数据库(如admin或myapp),而非操作数据库;不填或填错将导致Authentication failed。

连接字符串里必须包含用户名、密码和认证数据库
不填认证数据库(authSource)是初学者最常踩的坑。MongoDB 默认把用户信息存在 admin 库,但如果你在其他库(比如 myapp)里创建了用户,就得显式指定 authSource=myapp,否则会报 Authentication failed。
正确写法示例:
mongodb://user:pass@localhost:27017/mydb?authSource=admin
注意:mydb 是你后续操作的默认数据库,authSource 才是查用户凭据的地方。两者可以不同。
- 密码里含特殊字符(如
/、@、:)必须用urllib.parse.quote_plus()编码,否则连接会解析失败 - 不要把明文密码硬编码在字符串里;生产环境应从环境变量读取,例如
os.getenv("MONGO_PASSWORD") - 如果用的是 MongoDB Atlas,
authSource一律填admin,且连接字符串已自带该参数,别重复加
使用 motor 异步连接时,authMechanism 很可能要手动指定
某些部署环境(如启用了 LDAP 或 x.509 认证的集群)默认机制 SCRAM-SHA-256 可能不被客户端自动识别,导致 OperationFailure: Authentication failed。
立即学习“Python免费学习笔记(深入)”;
显式声明更稳妥:
client = motor.motor_asyncio.AsyncIOMotorClient(
"mongodb://user:pass@host:27017",
authSource="admin",
authMechanism="SCRAM-SHA-256"
)
- 常见机制还有
SCRAM-SHA-1(旧版)、MONGODB-X509(证书认证),选哪个取决于服务端配置 - PyMongo 4.0+ 默认用
SCRAM-SHA-256,但 motor 有时会 fallback 到旧机制,建议始终明确指定 - 异步连接务必搭配
await client.admin.command("ping")做连通性验证,不能只靠构造 client 实例判断成功
tls=True 和 tlsAllowInvalidCertificates=True 别混用
开启 TLS 是强制要求(尤其 Atlas 或企业版),但开发时本地自签名证书常让人忍不住加 tlsAllowInvalidCertificates=True —— 这会绕过证书校验,在生产环境等于裸奔。
- 开发调试阶段,优先用
ssl_ca_certs="/path/to/ca.pem"指向可信 CA 文件,而不是关校验 - 若真需跳过验证(仅限测试容器),必须同时设
tls=True和tlsAllowInvalidCertificates=True,缺一不可,否则连接直接拒绝 - PyMongo 4.0+ 中
ssl=已弃用,统一用tls=;旧代码升级时容易漏改,引发TypeError: __init__() got an unexpected keyword argument 'ssl'
连接池和超时参数必须显式控制
默认连接池无限复用、无超时,线上服务扛不住突发流量或网络抖动。常见症状:大量 ConnectionResetError 或请求卡死十几秒。
- 关键参数组合:
maxPoolSize=10、minPoolSize=2、connectTimeoutMS=5000、socketTimeoutMS=10000 - 高并发场景下,
maxIdleTimeMS(默认 0,即永不过期)建议设为60000,避免长连接占用过多 fd - 连接字符串里无法设置这些参数,必须传入
**kwargs给MongoClient构造函数
认证本身不复杂,难的是把连接生命周期、错误恢复、凭据管理这几件事串起来。漏掉任意一个环节,都可能让“连上了”变成“连得不稳”。


















