连接到MongoDB时,身份验证始终失败

时间:2015-06-13 18:55:56

标签: node.js mongodb authentication express

我正在使用node / express    node_modules =     “mongodb”:“2.0.33”,     “mongoose”:“3.8.15”,

mongo shell版本:3.0和mongo 3.0

我能够很好地连接到我的mongoDB,但如果我传入任何身份验证参数,它将会失败:

connection error: { [MongoError: auth failed] name: 'MongoError', ok: 0, errmsg: 'auth failed', code: 18 }

发生这种情况时,以下内容会显示在日志中:

2015-06-13T15:10:09.863-0400 I ACCESS [conn8] authenticate db: mydatabase { authenticate: 1, user: "user", nonce: "xxx", key: "xxx" } 2015-06-13T15:10:09.863-0400 I ACCESS [conn8] Failed to authenticate user@mydatabase with mechanism MONGODB-CR: AuthenticationFailed UserNotFound Could not find user user@mydatabase

我已经做了很多模式试图让它发挥作用。

当我在适当的数据库上执行mongo shell中的show users命令时会发生什么:

{
    "_id" : "mydatabase.user",
    "user" : "user",
    "db" : "mydatabase",
    "roles" : [
        {
            "role" : "readWrite",
            "db" : "mydatabase"
        }
    ]
}

这是我尝试在传递正确的参数时连接到这个特定的数据库:

mongoose.connect('mongodb://user:password@host:port/mydatabase');

为了更好的衡量,我还尝试传递一个选项哈希,而不是通过uri传递参数:

mongoose.connect('mongodb://host:port/mydatabase',{user: 'user',pass: 'password'});

奇怪的是,这可以从shell完成:

mongo mydatabase -u user -p password

如此清楚,凭据是正确的,它正在将它们排列到正确的数据库,但是与Mongoose的连接有些不起作用......

这是我在创建该用户时传入的shell命令:

db.createUser({ 
  user: "user",
  pwd: "password",
  roles: [
    { role: "readWrite", db: "mydatabase" }
  ]
});

我收到了一条成功消息,我在使用show users

时通过调用mydatabase命令确认了

我真的在这里失去了......这是我以前做过的一些尚未给我成功的研究:

  

Cannot authenticate into mongo, "auth fails"

这个答案表明它不会起作用,因为身份验证发生在数据库级别,所以我缺少某种配置选项供我的mongo实例使用,但是文档现在说这样的级别身份验证默认是禁用的,以及答案链接到的文档已被弃用。

  

MongoDB & Mongoose accessing one database while authenticating against another (NodeJS, Mongoose)

使用仍然有addUser的旧版Mongo 最重要的是,我不明白为什么它会起作用,因为它建议我在'auth'选项中添加一个参数,该参数未在文档中列出:
http://mongodb.github.io/node-mongodb-native/api-generated/db.html#authenticate

  

http://mongoosejs.com/docs/connections.html

基本上我现在正在尝试,但没有工作。

  

authenticate user with mongoose + express.js

我尝试过一些涉及做这类事情的答案,这给了我同样的错误。此外,我宁愿避免使用这类需要+80行代码进行身份验证的解决方案。我只是想首先获得基本身份验证。

2 个答案:

答案 0 :(得分:3)

您提到您使用的是MongoDB 3.0。在MongoDB 3.0中,它现在支持多种身份验证机制。

  1. MongoDB质询和响应(SCRAM-SHA-1) - 默认为3.0
  2. MongoDB质询和响应(MONGODB-CR) - 以前的默认值(< 3.0)
  3. 如果您使用新用户创建了新的3.0数据库,则可以使用SCRAM-SHA-1创建它们。

    所以你需要一个能够进行身份验证的驱动程序:

    http://docs.mongodb.org/manual/release-notes/3.0-scram/#considerations-scram-sha-1-drivers

    如果您使用现有用户数据从2.x升级数据库,他们仍将使用MONGODB-CR,并且必须升级用户身份验证数据库:

    http://docs.mongodb.org/manual/release-notes/3.0-scram/#upgrade-mongodb-cr-to-scram

    特定于您的特定环境由于正在使用的MongoDB Node.js驱动程序,该版本的Mongoose兼容性似乎不支持3.0(请参阅Mongoose网站上的兼容性页面 - 抱歉,可以&#39 ; t目前发布超过2个链接。

    我建议你更新Mongoose。

答案 1 :(得分:0)

Mongo v3.0 +:

db字段(角色对象之外)在这里很重要。这是不可设置的bby传递给createUser命令afaict。

设置它的方法是键入'使用'在发出creatUser命令之前。

除非你这样做,否则db对象里面的角色可能有正确的和预期的值,但是auth仍然无效。