我该如何通过 pymongo 验证 MongoDB 的用户名和密码认证?

17

我指的是http://api.mongodb.org/python/current/examples/authentication.html网站,用于提供身份验证机制示例。我已创建一个用户管理员,并使用其凭据为我的“报告”数据库创建了一个用户。现在,我需要使用用户名和密码通过pymongo访问该用户。我在Python shell中尝试了以下命令。由于我的身份验证失败,这是正确的方法吗?

from pymongo import MongoClient

client = MongoClient('localhost')

client.reporting.authenticate('reportsUser', '123456', mechanism='MONGODB-CR')

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/pymongo/database.py", line 746, in authenticate
    self.connection._cache_credentials(self.name, credentials)
  File "/usr/lib/python2.7/dist-packages/pymongo/mongo_client.py", line 441, in _cache_credentials
    auth.authenticate(credentials, sock_info, self.__simple_command)
  File "/usr/lib/python2.7/dist-packages/pymongo/auth.py", line 214, in authenticate
    auth_func(credentials[1:], sock_info, cmd_func)
  File "/usr/lib/python2.7/dist-packages/pymongo/auth.py", line 194, in _authenticate_mongo_cr
    cmd_func(sock_info, source, query)
  File "/usr/lib/python2.7/dist-packages/pymongo/mongo_client.py", line 607, in __simple_command
    helpers._check_command_response(response, None, msg)
  File "/usr/lib/python2.7/dist-packages/pymongo/helpers.py", line 147, in _check_command_response
    raise OperationFailure(msg % errmsg, code)
pymongo.errors.OperationFailure: command SON([('authenticate', 1), ('user', u'reportsUser'), ('nonce', u'f8158a24f1c61650'), ('key', u'14cea216c54b93bae20acd2e076bb785')]) failed: auth failed

你添加用户了吗?你启动了以 --auth 模式运行的 mongod 吗? - itzMEonTV
在mongod.conf中启用了auth=true并重新启动了mongod。还需要什么? - Mrunmayee
将用户添加到数据库。 - itzMEonTV
reportsUser是我为报告数据库创建的用户。我需要将它添加到管理数据库中吗? - Mrunmayee
不,管理员数据库用户可以访问所有数据库。您能在Mongo shell中进行身份验证吗? - itzMEonTV
显示剩余2条评论
3个回答

24

顺便提一下,您也可以使用URI字符串格式。 伪代码如下:

pymongo.MongoClient('mongodb://user:password@server:port/')

这是一个带有身份验证的简单连接代码块:

import pymongo
conn = pymongo.MongoClient('mongodb://root:pass@localhost:27017/')
db = conn['database']
coll = db['collection']

这里有更多的查询字符串选项:http://docs.mongodb.org/manual/reference/connection-string/

希望这能有所帮助 = 看起来你已经有了。编码愉快!!


2
能否用两个步骤完成,例如:pymongo.MongoClient(server:port/', ssl = True, ssl_keyfile ="path to private key"),然后auth = client.admin.authenticate(mongo_username,mongo_password)?能否在URI中不传递用户名和密码来完成这个操作? - Shivendra
@Shivendra:是的,PyMongo支持SCRAM-SHA-1模式下的两步验证,如此处所述。http://api.mongodb.com/python/current/examples/authentication.html - kilokahn
在我的情况下,URI 应该是 mongodb://root:pass@localhost:27017/databse,然后通过 db = client.get_database() 获取数据库。 - zhuguowei

8

仅在提供的解决方案上添加更多内容。

我一直在使用URI连接字符串和作为f字符串提供的凭据,这有助于减少行数。需要注意的一点是密码中的特殊字符,我们可以使用下面所示的urllib包进行转换。

import urllib.parse
from pymongo import MongoClient

host = "localhost"
port = 27017

user_name = "myuser"
pass_word = "Pass@123"  

db_name = "mydb"  # database name to authenticate

# if your password has '@' then you might need to escape hence we are using "urllib.parse.quote_plus()" 
client = MongoClient(f'mongodb://{user_name}:{urllib.parse.quote_plus(pass_word)}@{host}:{port}/{db_name}') 

1

这对我很有用。

在这里,您可以通过使用身份验证用户名和密码将mongodb连接到Python。

import pymongo

DATABASE_NAME = "your_database_name"
DATABASE_HOST = "localhost"

DATABASE_USERNAME = "database_username"
DATABASE_PASSWORD = "database_password"

try:
    myclient = pymongo.MongoClient( DATABASE_HOST )
    myclient.test.authenticate( DATABASE_USERNAME , DATABASE_PASSWORD )
    mydb = myclient[DATABASE_NAME]

    print("[+] Database connected!")
except Exception as e:
    print("[+] Database connection error!")
    raise e


默认情况下,Mongodb 使用 27017 端口。

嗨!我正在尝试这种方法,但在某些情况下,例如:AWS Lambda,在某些超时情况下,我从未注意到。 - omalave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接