25

我的问题是关于如何通过 pymongo 验证 mongodb 身份验证的用户名密码的规范?.

我正在尝试使用 PyMongo 3.2.2 和包含用户和密码的 URL 连接到 MongoDB 实例,如MongoDB Docs中所述。不同之处在于我使用的密码包含一个“@”。

起初我只是尝试连接而不转义,如下所示:

前缀 = 'mongodb://'

用户 = '用户:passw_with_@_'

后缀 = '@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://'

用户 = urllib.quote('user:passw_with_@_')

后缀 = '@127.0.0.1:27001/'

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

但后来我得到了一个:

OperationFailure: Authentication failed.

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

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

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

TL;博士;

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

4

4 回答 4

45

您应该能够使用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 连接字符串中假设:

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

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

url.parse.quote("p@ssword")
于 2016-09-02T02:05:10.663 回答
11

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

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 spun up app 的情况下设法连接到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))
于 2018-07-11T13:55:02.387 回答
2

在终端中运行:

python -m pip install pymongo[srv]

蟒蛇文件:

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']
于 2020-06-15T19:02:54.620 回答
0

只是信息:

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

Windows 数据库名称的限制

/\. "$*<>:|?

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

/\. "$

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

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

于 2021-06-01T09:41:35.610 回答