如何在pymongo连接中输入密码?

时间:2016-08-30 22:06:14

标签: python mongodb authentication pymongo-3.x

我的问题是how can i validate username password for mongodb authentication through pymongo?的规范。

我正在尝试使用PyMongo 3.2.2和包含用户和密码的URL连接到MongoDB实例,如MongoDB Docs中所述。不同的是我使用的密码包含'@'。

起初我只是尝试连接而不会逃避,就像这样:

  

prefix ='mongodb://'

     

user ='user:passw_with _ @ _'

     

suffix ='@ 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()传递部分,如下所示:

  

prefix ='mongodb://'

     

user = urllib.quote('user:passw_with _ @ _')

     

suffix ='@ 127.0.0.1:27001 /'

     

conn = pymongo.MongoClient(前缀+用户+后缀)

然后我得到了一个:

OperationFailure: Authentication failed.

(重要的是说使用GUI MongoDB管理工具(Robomongo,如果这很重要)我可以使用(真实)地址和凭证连接到MongoDB。)

在上面的代码中打印用户变量会生成一个'user:passw_with_%40_'字符串(即'@'变为'%40')并根据wikipedia表示这是预期的转义。

我甚至尝试使用单反斜杠和双反斜杠(user = 'user:passw_with_\\@_'user = 'user:passw_with_\@_')转义@,但那些因InvalidURI异常而失败。

TL; DR;

我的问题是:如何在MongoDB网址的密码部分中转义“@”?

4 个答案:

答案 0 :(得分:21)

您应该可以使用urllib.quote()转义密码。虽然您只应引用/转义密码,但排除username:; 否则:也会转义为%3A

例如:

import pymongo 
import urllib 

mongo_uri = "mongodb://username:" + urllib.quote("p@ssword") + "@127.0.0.1:27001/"
client = pymongo.MongoClient(mongo_uri)

上面的代码片段针对MongoDB v3.2.x,Python v2.7和PyMongo v3.2.2进行了测试。

上面的示例假设在MongoDB URI connection string

  • 用户在admin数据库中创建。
  • 运行的主机mongod是127.0.0.1(localhost)
  • 分配的端口mongod为27001

对于Python 3.x,您可以使用urllib.parse.quote()使用%xx转义替换密码中的特殊字符。例如:

url.parse.quote("p@ssword")

答案 1 :(得分:4)

Python 3.6.5-用于连接到mlab实例的PyMongo 3.7.0版本:

from pymongo import MongoClient
import urllib.parse

username = urllib.parse.quote_plus('username')
password = urllib.parse.quote_plus('password')
client = MongoClient('mongodb://%s:%s@ds00000.mlab.com:000000/recipe_app_testing' % (username, password))

这是我设法不使用flask-pymongo旋转应用程序而连接到mlab MongoDB实例的唯一方法,我需要为单元测试创​​建夹具。

Python 3.6.5-PyMongo 3.7.0本地主机版本:

from pymongo import MongoClient
import urllib.parse 

username = urllib.parse.quote_plus('username')
password = urllib.parse.quote_plus('password')
client = MongoClient('mongodb://%s:%s@127.0.0.1:27001/' % (username, password))

答案 2 :(得分:2)

在终端中运行:

python -m pip install pymongo[srv]

python文件:

import pymongo
from pymongo import MongoClient
import urllib.parse

username = urllib.parse.quote_plus('username')
password = urllib.parse.quote_plus("password")

url = "mongodb+srv://{}:{}@cluster0-0000.mongodb.net/<dbname>?retryWrites=true&w=majority".format(username, password)
# url is just an example (your url will be different)

cluster = MongoClient(url)
db = cluster['Sample']
collection = db['temporary']

答案 3 :(得分:0)

只是信息:

MongoDB、pymongo 和 mongoengine 无法处理密码中的多个符号;

<块引用>

Windows 数据库名称限制

/\. "$*<>:|?

Unix 和 Linux 系统的数据库名称限制

/\. "$

https://docs.mongodb.com/manual/reference/limits/#Restrictions-on-Field-Names

包含非法符号时转义不起作用。