身份验证无法使用pymongo连接到mongodb

时间:2017-08-17 10:36:24

标签: python python-2.7 pymongo

我们使用连接到mongodb的pymongo在python脚本中编写了一段代码。

username = 'abc'
password = 'xxxxxx'
server = 'dns name of that server'
port = 27017

在程序中,代码如下:

import pymongo
from pymongo import MongoClient
client = MongoClient(url, serverSelectionTimeoutMS=300)
database = client.database_name
data_insert = database.collection_name.insert_one({'id': 1, 'name': xyz})

当我尝试执行这些操作时,会引发错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/pymongo/cursor.py", line 1114, in next
    if len(self.__data) or self._refresh():
  File "/usr/local/lib/python2.7/dist-packages/pymongo/cursor.py", line 1036, in _refresh
    self.__collation))
  File "/usr/local/lib/python2.7/dist-packages/pymongo/cursor.py", line 873, in __send_message
    **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/mongo_client.py", line 905, in _send_message_with_response
    exhaust)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/mongo_client.py", line 916, in _reset_on_error
    return func(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/server.py", line 99, in send_message_with_response
    with self.get_socket(all_credentials, exhaust) as sock_info:
  File "/usr/lib/python2.7/contextlib.py", line 17, in __enter__
    return self.gen.next()
  File "/usr/local/lib/python2.7/dist-packages/pymongo/server.py", line 168, in get_socket
    with self.pool.get_socket(all_credentials, checkout) as sock_info:
  File "/usr/lib/python2.7/contextlib.py", line 17, in __enter__
    return self.gen.next()
  File "/usr/local/lib/python2.7/dist-packages/pymongo/pool.py", line 792, in get_socket
    sock_info.check_auth(all_credentials)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/pool.py", line 512, in check_auth
    auth.authenticate(credentials, self)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/auth.py", line 470, in authenticate
    auth_func(credentials, sock_info)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/auth.py", line 450, in _authenticate_default
    return _authenticate_scram_sha1(credentials, sock_info)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/auth.py", line 201, in _authenticate_scram_sha1
    res = sock_info.command(source, cmd)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/pool.py", line 419, in command
    collation=collation)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/network.py", line 116, in command
    parse_write_concern_error=parse_write_concern_error)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/helpers.py", line 210, in _check_command_response
    raise OperationFailure(msg % errmsg, code, response)
pymongo.errors.OperationFailure: Authentication failed.

在MongoDB中,在执行查询时,我们会正常收到回复,而不会产生任何错误。

4 个答案:

答案 0 :(得分:2)

由于您的问题的其他答案对我不起作用,因此我将从a similar question复制并粘贴我的答案。

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

*This program block sets up our data set;
data episodes; 
INPUT ID_NO $ ADMIT_DATE mmddyy10. TOTAL_COST DISC_DATE mmddyy10.;
DATALINES;
1 01/01/2017 3000 01/03/2017
2 01/01/2017 14000 01/14/2017
;
run;

data new_episodes (keep= ID_NO XDATE DAILY_COST);
  set episodes;
  NUM_DAYS= DISC_DATE-ADMIT_DATE;
DAILY_COST= TOTAL_COST/(DISC_DATE-ADMIT_DATE);
*Using the Do While loop to create a matrix of date observations;
XDATE=ADMIT_DATE;*initializing our variable;
   do while(XDATE<DISC_DATE);
      put XDATE=;
      XDATE+1;
      output;*outputting the date variable;
   end;

format XDATE mmddyy10.;
run;

proc print data=new_episodes;
run;

您很有可能需要在您的uri末尾添加pymongo.errors.OperationFailure: Authentication failed.

这是我在MongoDB服务器版本4.2.6和MongoDB Shell版本v3.6.9中使用的有效解决方案。

?authSource=admin

类似的命令行修复程序正在添加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)

答案 1 :(得分:0)

您有身份验证错误,因此首先需要

{{1}}

现在您可以尝试插入文档。

取自official mongodb documentation

答案 2 :(得分:0)

好吧,我被大约3-4个小时的相同错误困扰。我遇到了以下步骤的解决方案:

通过输入以下内容从您的Shell连接到MongoDB:mongo

然后,创建一个数据库:use test_database

现在使用以下命令创建具有readWritedbAdmin特权的用户。

db.createUser(
   {
     user: "test_user",
     pwd: "testing12345",
     roles: [ "readWrite", "dbAdmin" ]
   }
);

这将提示Successfully added user: { "user" : "test_user", "roles" : [ "readWrite", "dbAdmin" ] }

您可以通过输入以下内容进行检查:show users。 它还会显示您之前在json中创建的数据库名称。

现在您应该可以将数据插入数据库了

client = MongoClient("mongodb://test_user:myuser123@localhost:27017/test_database")
db = client.test_database

data = {"initial_test":"testing"}
db["my_collection"].insert_one(data).inserted_id

答案 3 :(得分:0)

我遇到了这个错误,我的问题是密码。

我认为主帐户中有一个特殊字符。将密码更改为仅字母数字为我修复了它。

代码片段

client = pymongo.MongoClient(
        'mongodb://username:alphaNumericPassword@localhost:27017/?ssl=true&ssl_ca_certs=rds-combined-ca-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false'
    )

    # Specify the database to be used
    db = client['prod-db']