pymongo auth在python脚本中失败了

sha*_*fri 18 python mongodb pymongo

我已经安装了mongodb并启用了auth.和它的工作发现.我可以使用robomongo应用程序从远程笔记本连接它:

Host: SERVER_IP
PORT: 27017
DATEBASE: prod-db
USERNAME: user_name
PASS: user_password
Auth Mechanism: MONGODB-CR
Run Code Online (Sandbox Code Playgroud)

我们可以使用以下方式从本地连接服务器shell:

$ mongo prod-db -u user_name -p user_password
Run Code Online (Sandbox Code Playgroud)

一切正常,但是当我们尝试使用pymongo api时.身份验证失败.下面是python代码:

from pymongo import MongoClient

client = MongoClient()
client.prod_db.authenticate('user_name', 'user_password', mechanism='MONGODB-CR')
db = client.prod_db
result = db.users.find()

for document in result:
    print(document)
Run Code Online (Sandbox Code Playgroud)

使用的工具:

python 2.7
pymongo versiob 3.3.1
MongoDB shell version: 2.6.10
$ mongod --version
db version v2.6.10
2016-10-31T16:34:59.868+0000 git version: nogitversion
2016-10-31T16:34:59.868+0000 OpenSSL version: OpenSSL 1.0.2g  1 Mar 2016
Run Code Online (Sandbox Code Playgroud)

错误跟踪:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/pymongo/database.py", line 1018, in authenticate
    connect=True)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/mongo_client.py", line 444, in _cache_credentials
    sock_info.authenticate(credentials)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/pool.py", line 343, in authenticate
    auth.authenticate(credentials, self)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/auth.py", line 464, in authenticate
    auth_func(credentials, sock_info)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/auth.py", line 439, in _authenticate_mongo_cr
    sock_info.command(source, query)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/pool.py", line 239, in command
    read_concern)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/network.py", line 102, in command
    helpers._check_command_response(response_doc, None, allowable_errors)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/helpers.py", line 205, in _check_command_response
    raise OperationFailure(msg % errmsg, code, response)
Run Code Online (Sandbox Code Playgroud)

解决方案: 问题在于数据库名称,以下代码正常工作:

from pymongo import MongoClient

client = MongoClient('mongodb://user_name:user_password@localhost:27017/prod-db')
db = client['prod-db']

result = db.users.find()
for document in result:
    print document
Run Code Online (Sandbox Code Playgroud)

mil*_*.ai 35

请尝试这样的事情:

client = MongoClient("mongodb://user_name:user_password@SERVER_IP/prod-db")
db = client['prod-db']
Run Code Online (Sandbox Code Playgroud)

  • 使用 Mongo 3,我们需要传递完整的服务器 URI (2认同)

Nat*_*han 12

如果您已经尝试了上述答案,但仍然出现错误:

pymongo.errors.OperationFailure: Authentication failed.
Run Code Online (Sandbox Code Playgroud)

您很有可能需要添加?authSource=admin到 uri 的末尾。

这是我与 MongoDB 服务器版本 4.2.6 和 MongoDB shell 版本 v3.6.9 一起使用的工作解决方案。

from pymongo import MongoClient

# Replace these with your server details
MONGO_HOST = "XX.XXX.XXX.XXX" 
MONGO_PORT = "27017"
MONGO_DB = "database"
MONGO_USER = "admin"
MONGO_PASS = "pass"

uri = "mongodb://{}:{}@{}:{}/{}?authSource=admin".format(MONGO_USER, MONGO_PASS, MONGO_HOST, MONGO_PORT, MONGO_DB)
client = MongoClient(uri)
Run Code Online (Sandbox Code Playgroud)

命令行的类似修复正在添加 --authenticationDatabase admin

  • 这为我解决了。多谢!虽然我不需要端口。 (4认同)

Har*_*ani 8

对于皮蒙戈,

试试下面的MongoDB 4

添加authSource:这是包含用户凭据集合的数据库的名称。

前任:

client = MongoClient(host=<<hostname>>,
                     port=<<port>>, 
                     username=<<user_name>>, 
                     password=<<password>>,
                    authSource="admin")
db_obj = client[db_name]
Run Code Online (Sandbox Code Playgroud)

编辑 1:我也在 Mongo 3.x 版本上尝试过这个。也为此工作。