我的问题是关于 如何通过 pymongo 验证用户名密码以进行 mongodb 身份验证的规范? .
我正在尝试使用 PyMongo 3.2.2 和包含用户和密码的 URL 连接到 MongoDB 实例,如 MongoDB Docs 中所述。不同之处在于我使用的密码包含一个“@”。
起初我只是简单地尝试连接而不逃避,就像这样:
前缀 = ‘mongodb://’
user = ‘user:passwwith@_’
后缀 = ‘@127.0.0.1:27001/’
conn = pymongo.MongoClient(前缀+用户+后缀)
自然地,我收到以下错误:
InvalidURI: ':' or '@' characters in a username or password must be escaped according to RFC 2396.
所以我尝试使用 urllib.quote() 转义 user:pass 部分,如下所示:
前缀 = ‘mongodb://’
user = urllib.quote(‘user:passwwith@_’)
后缀 = ‘@127.0.0.1:27001/’
conn = pymongo.MongoClient(前缀+用户+后缀)
但后来我得到了一个:
OperationFailure: Authentication failed.
(重要的是,使用 GUI MongoDB 管理工具( Robomongo ,如果重要的话)我能够使用(真实)地址和凭据连接到 MongoDB。)
在上面的代码中打印用户变量生成了一个 'user:passw_with_%40_'
字符串(即“@”变成了“%40”),根据 维基百科,这是预期的转义。
我什至尝试使用单反斜杠和双反斜杠( user = 'user:passw_with_\\@_'
和 user = 'user:passw_with_\@_'
)转义 @,但这些都因 InvalidURI 异常而失败。
长话短说;博士;
我的问题是:如何在 MongoDB URL 的密码部分转义“@”?
原文由 gmauch 发布,翻译遵循 CC BY-SA 4.0 许可协议
您应该能够使用
urllib.quote()
转义密码。尽管您应该只引用/转义密码,并排除username:
;否则:
也将转义为%3A
。例如:
上面的代码片段针对 MongoDB v3.2.x 和 PyMongo v3.2.2 进行了测试。
上面的示例假定在 MongoDB URI 连接字符串 中:
admin
数据库中创建。mongod
是 127.0.0.1 (localhost)mongod
是27001